Остановка супервайзера не останавливает работников сельдерея

Как обеспечить, чтобы подпроцессы останавливались при остановке Supervisord?

Я использую Supervisord для работы двух работников сельдерея. Команда для каждого работника:

command=/usr/local/myapp/src/manage.py celery worker --concurrency=1 --loglevel=INFO

Когда я запускаю супервизор, они работают отлично, но когда я запускаю sudo service supervisord stop, он сообщает, что мои рабочие останавливаются:

celery_1: stopped
celery_2: stopped

Однако, когда я запускаю ps aux | grep celery, я вижу, что они все еще запущены:

www-data 27667  0.0  1.5 318420 64360 ?        S    10:45   0:00 manage.py celery worker --concurrency=1 --loglevel=INFO
www-data 27668  0.0  1.5 318420 318416 ?        S    10:45   0:00 manage.py celery worker --concurrency=1 --loglevel=INFO

Ответ 1

Я считаю, что остановка службы супервизора останавливает демон супервизора, а не процесс супервизора, который управляет вашими работниками celery.

supervisorctl stop all должен позволить вам остановить рабочих, а также разрешить вам запускать/перезапускать их

http://supervisord.org/running.html#running-supervisorctl

Ответ 2

Причина, по которой я оказался здесь, заключается в том, что, когда я использовал супервизора для начала и прекращения процессов сельдерея, рабочие сельдерея не останавливались, что приводило к накоплению рабочих.

Я пробовал различные настройки в супервизоре, такие как stopignal и killasgroup. Никто из них не остановил рабочих.

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

В итоге я добавил:

ps auxww | grep 'celery worker' | awk '{print $2}' | xargs kill -9

для моих скриптов. Это от документация по сельдериуму

В конце этой команды я попытался убить -TERM вместо kill -9, надеясь, что это будет убивать процессы более изящно. Но это всегда оставило один процесс.

Ответ 3

Взгляните в свой superisord.log. Может быть, супервизор отправляет SIGKILL в сельдерей? Если это так, попробуйте увеличить таймаут (например, stopwaitsecs = 600).

https://github.com/celery/celery/issues/102

Ответ 4

Не уверен, но это швы, как в этом случае, супервизор управляет ш-скриптами. Не потоки python. Можете ли вы отобразить ps auxf | grep celery, в то время как супервизор работает? Может быть редактирование команды, например: command=python /path/to/manage.py ..., будет полезно.

Ответ 5

У меня были такие проблемы с каналами django, настройками stopasgroup=true в конфигурации suppervisor (как предлагалось здесь). Исправлена ​​проблема. Однако я не понимаю, почему.