Django wsgi subprocess.Popen processes die on gunicorn restart
В настоящее время я работаю над проектом django, обслуживаемым Nginx+gunicorn. Одной из функций приложения является запуск и остановка ботов в фоновом режиме. Я достиг этого, используя модуль 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.
Как я могу использовать subprocess.Popen
с gunicorn и запустить процесс полностью отдельно в системе linux?
Другими вариантами, которые я рассматриваю, являются
- Начните использовать Celery (но я не уверен, подходит ли он для запуска/остановки демонов) .
- Используйте
systemctl --user
, но была проблема, что пользовательские службы systemctl умирают после выхода пользователя из системы .
- Используйте python-daemon .
Каковы лучшие практики для запуска процессов демонов из django? Идея заключается в том, чтобы запускать, останавливать и проверять статус таких процессов.