簡體   English   中英

如何使用daemontools運行Django服務器

[英]How to run django server with daemontools

我正在使用默認的manage.py文件運行Django Web服務器,如何使用svc daemontools將其守護進程

我在daemontools中運行文件的內容是

#!/bin/bash
exec setuidgid <myuser> /usr/bin/python <path/to/manage.py> runserver 2>&1

manage.py的內容

import os
import sys

if __name__ == "__main__":
  os.environ.setdefault("DJANGO_SETTINGS_MODULE","settings")

from django.core.management import execute_from_command_line

execute_from_command_line(sys.argv)

svscanboot的子進程(manage.py運行服務器)在execute_from_command_line(從django.core.management導入)函數中派生出另一個進程,該進程無法通過svc命令進行控制。 以下是svscanboot的進程樹。

/bin/sh /usr/bin/svscanboot
\_ svscan /etc/service
   \_ supervise myapp
      \_ /usr/bin/python </path/to/manage.py> runserver
          \_ /usr/bin/python </path/to/manage.py> runserver

現在,如果我執行svc -d,它將向第一個runserver進程發送TERM信號,結果就是該命令被殺死,第二個進程成為孤立的進程,無法通過svc命令進行控制。

那么,如何使用daemontools控制子進程的整個進程樹?

這可以通過運行帶有--noreload選項的django服務器來解決。

Django僅在未傳遞--noreload時才生成另一個進程,這僅適用於開發環境。

https://github.com/django/django/blob/master/django/utils/autoreload.py#L290

在非開發環境中,您不希望django服務器重新加載,因為您不會在此類環境中更改代碼。 因此,使用--noreload運行服務器即可解決此問題。

但是,不建議在生產環境中運行默認的django服務器。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM