当我停止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
答案 0 :(得分:7)
我认为停止主管服务会停止主管守护程序,而不是管理您的芹菜工作者的主管程序
supervisorctl stop all
应允许您停止工作人员,并允许您启动/重新启动它们
答案 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)。
答案 4 :(得分:0)
我在django频道遇到过这样的问题,suppervisor配置中设置stopasgroup=true
(as suggested here)解决了这个问题。但是,我不明白为什么。