" celeryd stop"不管用

时间:2014-06-16 13:46:19

标签: python celery celeryd

我正在以一种不寻常的方式使用芹菜 - 我在芹菜启动时创建自定义过程,这个过程应该在芹菜运行时一直运行。 芹菜工人将此过程用于他们的任务(不需要详细信息)。

我从命令行运行celery,一切正常:

celery -A celery_jobs.tasks.app worker -B --loglevel=warning

但是当我使用celeryd守护芹菜时,没有办法阻止它。 命令celeryd stop试图阻止芹菜,但永远不会结束。

当我在两种情况下检查进程树时,存在差异 - 当从命令行运行时,父进程显然是芹菜进程(主要进程将芹菜工作者作为子进程)。杀死(停止)父母芹菜过程将停止所有芹菜工人和我的自定义过程。

但是当使用celeryd运行时,我的自定义进程有父/sbin/init - 并且调用celeryd stop无效 - 似乎主芹菜进程正在等待某些事情,或者无法停止我的自定义过程,因为它不是芹菜的子过程。

我对流程了解不多,而且查找信息并不容易,因为我不知道应该搜索什么,所以任何提示都会受到赞赏。

2 个答案:

答案 0 :(得分:2)

我遇到了同样的问题。我需要一个快速的解决方案,所以我写了这个bash脚本

#/bin/bash

/etc/init.d/celeryd stop
sleep 10
export PIDS=`ps -ef | grep celery |grep -v 'grep' | awk '{print $2}'`
for PID in $PIDS; do kill -9 $PID; done;

如果过程在10秒后没有停止,那么这是一个长时间停止的候选人,所以我决定突然停止

答案 1 :(得分:0)

我假设您的自定义流程不是任何池工作进程的子进程,并且不必如此。

我使用supervisord而不是celeryd来守护工人。它也可以用于守护其他进程。比如你的自定义流程。

在您的情况下,您的supervisord.conf可以有多个部分。每个芹菜工作者节点一个,自定义进程一个(或多个)。

当你杀死supervisord进程(使用-TERM)时,它将负责终止所有worker和你的自定义进程。如果您使用-TERM,那么您需要确保自定义进程处理它们。