如何使用 daemontools 运行 django 服务器
How to run django server with daemontools
我正在 运行使用默认 manage.py 文件连接一个 django 网络服务器,我如何使用 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 运行server)在execute_from_command_line(从django.core.management导入)函数中fork掉另一个进程,无法通过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,它会向第一个 运行 服务器进程发送 TERM 信号,结果它被杀死,第二个进程变成一个无法通过 svc 控制的孤儿进程命令。
那么如何使用daemontools控制子进程的整个进程树呢?
这可以通过使用 --noreload 选项 运行ning django 服务器来解决。
Django 仅在未传递 --noreload 时生成另一个进程,这仅适用于开发环境。
https://github.com/django/django/blob/master/django/utils/autoreload.py#L290
在非开发环境中,您不希望重新加载 django 服务器,因为您不会在此类环境中更改代码。所以 运行使用 --noreload 连接服务器解决了这个问题。
但是不建议 运行 在生产中使用默认的 django 服务器。
我正在 运行使用默认 manage.py 文件连接一个 django 网络服务器,我如何使用 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 运行server)在execute_from_command_line(从django.core.management导入)函数中fork掉另一个进程,无法通过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,它会向第一个 运行 服务器进程发送 TERM 信号,结果它被杀死,第二个进程变成一个无法通过 svc 控制的孤儿进程命令。
那么如何使用daemontools控制子进程的整个进程树呢?
这可以通过使用 --noreload 选项 运行ning django 服务器来解决。
Django 仅在未传递 --noreload 时生成另一个进程,这仅适用于开发环境。
https://github.com/django/django/blob/master/django/utils/autoreload.py#L290
在非开发环境中,您不希望重新加载 django 服务器,因为您不会在此类环境中更改代码。所以 运行使用 --noreload 连接服务器解决了这个问题。
但是不建议 运行 在生产中使用默认的 django 服务器。