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? Идея заключается в том, чтобы запускать, останавливать и проверять статус таких процессов.

Вернуться на верх