[英]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.