Остановка Supervisor не останавливает работников Celery

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

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

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

person Cerin    schedule 12.06.2013    source источник
comment
Привет @Certin, ты нашел решение для этого?   -  person securecurve    schedule 26.09.2013
comment
тоже интересно решение..   -  person kev    schedule 13.11.2013
comment
Cerin: Вы нашли решение для этого?   -  person securecurve    schedule 12.03.2014


Ответы (5)


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

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

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

person dm03514    schedule 12.06.2013
comment
Сигнал, который супервизор отправляет рабочим celery, не убьет их немедленно, если они все еще обрабатывают задачи в этот момент, они будут продолжать работать, пока эти задачи не будут выполнены. Таким образом, вашим рабочим процессам может потребоваться много времени, чтобы закрыться даже после вызова supervisorctl stop all. - person jeverling; 20.03.2015

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

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

На данный момент кажется, что процесс celery не отправляет сигналы рабочим процессам, когда он остановлен.

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

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

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

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

person Chuck    schedule 26.01.2015
comment
Вам лучше использовать pgrep. Использование ps | grep может иметь некоторые проблемы, такие как сам процесс grep, находящийся в списке. pgrep -f 'celery worker' | xargs kill -9 или просто pkill -f 'celery worker'. - person Antoine Pinsard; 28.11.2016
comment
Я добавил stopasgroup=true в раздел [program:x] супервизора (v4.2.0), и это сработало как чудо. В некоторых случаях может быть более выгодным, чем ручное вмешательство. - person gabn88; 28.10.2020

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

person S.Kozlov    schedule 12.06.2013

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

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

person Marius Loewe    schedule 15.11.2013

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

person Antoine Pinsard    schedule 28.11.2016