python - Django wsgi subprocess.Popen 进程在 gunicorn 重启时死亡
问题描述
我目前正在从事由 Nginx+gunicorn 服务的 django 项目。该应用程序的功能之一是在后台运行和停止机器人。我已经使用subprocess
python 模块实现了它,但问题是我开始的过程subprocess.Popen
变成了 gunicorn 的子进程并且到目前为止我重新启动了 gunicorn。代码如下所示:
subprocess.Popen(
['runbot'],
close_fds=True,
start_new_session=True,
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL,
)
其中“runbot”是机器人的可执行文件,它启动并运行,直到收到 SIGTERM 信号。选项在这里close_fds
并start_new_session
没有帮助,并且该过程仍然作为父 gunicorn 进程的子进程开始。
有趣的观察 - 这似乎是一个与 wsgi 相关的问题,因为当我使用内置的 django dev web-server 启动项目时,一切都按预期工作。
如何使用subprocess.Popen
with gunicorn 并在 linux 系统上完全分离地运行该进程?
我考虑的其他选择是
- 开始使用 Celery(但我不确定它是否适合启动/停止守护进程)
- 使用
systemctl --user
,但是出现用户退出系统后用户systemctl服务死掉的问题 - 使用 python-daemon
从 django 运行守护进程的最佳实践是什么?这个想法是启动、停止和检查这些进程的状态。
解决方案
推荐阅读
- jenkins - Jenkins 在 sh 中使用脚本变量
- react-native - 我如何在同一个 webview 中打开 webview 链接?
- solr - 无法解释的 SOLR 查询
- php - 如何在 Gitlab CI 中为基于 Docker 的 PHP 应用程序创建测试管道
- python - 隐藏嵌入式窗口栏 pyqt5/隐藏 selenium 窗口标题栏而不全屏 & 使 pyqt5 嵌入式窗口不可拖动/调整大小
- firebase - 从云存储中检索数据时出现问题
- python-3.x - 如何让 mypy 忽略或识别动态添加的属性?
- sql-server - 根据频率、工作日和时间表制定下一次报告运行
- python - 如何在“for循环”python中同时打印数组中的第一个和第二个值
- r - 如何动态命名 R Shiny 中的数据框?