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