2013-06-12 41 views
13

如何确保在停止Supervisord时子流程停止?停止监督员不会阻止芹菜工人

我使用Supervisord来运行两名芹菜工人。每个工人的命令是:

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

当我开始supervisord,它们完美地运行,但是当我运行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

嗨@Certin,你有没有为此解决问题? – securecurve

+0

也会对解决方案感兴趣。 – kev

+0

Cerin:你找到了解决方案吗? – securecurve

回答

6

我相信,停止监督员服务停止监守护进程,而不是在管理您的策勒县管理进程ryworkers

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

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

+3

监督员发送给芹菜工的信号不会立即杀死他们,如果他们仍然在处理任务,那么他们将继续运行,直到完成这些任务。因此,即使调用'supervisorctl stop all'后,您的工作人员可能需要很长时间才能关闭' – jeverling

0

不知道,但在这种情况下,接缝一样,监督员管理sh脚本。不是python线程。你可以显示ps auxf | grep celery,而supervisord正在运行?可能会编辑该命令,如下所示:command=python /path/to/manage.py ...,将会有所帮助。

3

我在这里结束了的是,当我使用监督员启动和停止我的芹菜过程中,芹菜工人并没有停止,这导致工人的积累的原因。

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

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

我最终什么事做了补充:

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

到我的脚本。这是从the celery docs

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

+0

您应该使用'pgrep'。使用'ps | grep'可能有一些问题,例如列表中的grep进程本身。 'pgrep -f'芹菜工人'| xargs杀死-9'或者简单地'pkill -f'芹菜worker''。 –

0

我用django频道有这样的问题,在suppervisor config(as suggested here)中设置stopasgroup=true修复了这个问题。不过,我不明白为什么。