Как убить процесс uwsgi без повторного появления работника

У меня возникли проблемы с уничтожением процессов uwsgi. Всякий раз, когда я использую приведенные ниже команды для отключения uwsgi, через несколько секунд вновь появляются новые рабочие uwsgi. Поэтому после выключения процесса uwsgi и повторного запуска сервера uwsgi, процессы uwsgi продолжают накапливаться в памяти.

  • sudo pkill -f uwsgi -9
  • kill -9 cat /tmp/MyProject.pid
  • uwsgi --stop /tmp/MyProject.pid
  • .

Я хочу знать, как убить процессы uwsgi, не заставляя рабочих uwsgi перерождаться. Я прилагаю ini файл, как показано ниже.

[uwsgi]
chdir            = /home/data/MyProject/
module           = MyProject.wsgi
home             = /home/data/anaconda3/envs/env1
master           = true
pidfile          = /tmp/MyProject.pid
single-interpreter = true
die-on-term     = true 
processes       = 4
socket          = /home/data/MyProject/MyProject.sock
chmod-socket    = 666
vacuum          = true

Заранее спасибо!!!

сначала:

  1. uwsgi - это двоичный протокол, который uWSGI использует для связи с другими серверами. uWSGI - это сервер приложений.
  2. Вам следует избегать (1, 2) использования -9 (SIGKILL) для остановки процесса, если вы заботитесь о дочерних процессах (рабочих)
  3. .

что я могу сказать по вашей информации:

Когда я использую приведенные ниже команды для выключения uwsgi, другой рабочий uwsgi worker возрождаются через несколько секунд

Похоже, что вы пытаетесь убить рабочий (дочерний) процесс, но не сервер приложений uWSGI (главный процесс). Вот processes = 4 в вашем конфиге, поэтому сервер приложений (главный процесс) следит за минимальным количеством запущенных рабочих (дочерних процессов). И если один из них завершился (по сигналу KILL или исключению исходного кода, неважно), сервер приложений запускает новый 4-й процесс.

После завершения процесса uwsgi и запуска сервера uwsgi снова

.

Если uwsgi process является рабочим (дочерним процессом) - см. ответ выше

Если uwsgi process - это сервер приложений (главный процесс) - здесь другая проблема. Вы используете сигнал KILL (-9) для остановки сервера. А это не позволяет правильно завершить работу приложения (см. второй пункт at first). Поэтому, когда ваш сервер приложения неожиданно завершается, он оставляет все 4 дочерних процесса запущенными без родительского (главного) процесса (передайте привет orphaned process)

Вам следует использовать SIGTERM вместо SIGKILL. Понимаете ли вы значение die-on-term = true? Да! Это означает please stop stack of all processes on SIGTERM.

uwsgi --stop /tmp/MyProject.pid

Эта команда должна правильно остановить все процессы. В вашем вопросе нет информации, чтобы решить, какая это может быть проблема...

У меня есть три предположения:

  1. проблема с источником веб-приложения: операция выхода не обрабатывается должным образом
  2. die-on-term = true инвертирует значения SIGTERM и SIGQUIT в uWSGI, так что, возможно, stop работает как reload в этом случае? не уверен.
  3. какое-то недоразумение
Вернуться на верх