停止主管不会阻止芹菜工人

时间:2013-06-12 15:25:54

标签: python django-celery supervisord

当我停止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

5 个答案:

答案 0 :(得分:7)

我认为停止主管服务会停止主管守护程序,而不是管理您的芹菜工作者的主管程序

supervisorctl stop all应允许您停止工作人员,并允许您启动/重新启动它们

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

答案 1 :(得分:5)

我最终在这里的原因是,当我使用主管开始和停止我的芹菜加工时,芹菜工人没有停下来,这导致了工人的积累。

我在主管中尝试了各种设置,例如stopsignal和killasgroup。他们都没有阻止工人。

此时,似乎芹菜过程在停止时不会向工人发送信号。

我最终做的是添加:

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

到我的脚本。这来自the celery docs

在这个命令的最后,我尝试杀死-TERM而不是kill -9,希望这会更优雅地杀死进程。但这总是留下一个过程。

答案 2 :(得分:1)

不确定,但在这种情况下,主管正在管理sh脚本。不是python线程。当supervisord正在运行时,你能显示ps auxf | grep celery吗?可能正在编辑命令,如下所示:command=python /path/to/manage.py ...,将会有所帮助。

答案 3 :(得分:1)

看看你的supervisord.log。也许supervisord正在向芹菜发送SIGKILL?如果是,请尝试增加超时(例如stopwaitsecs = 600)。

  

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

答案 4 :(得分:0)

我在django频道遇到过这样的问题,suppervisor配置中设置stopasgroup=trueas suggested here)解决了这个问题。但是,我不明白为什么。