我正在以一种不寻常的方式使用芹菜 - 我在芹菜启动时创建自定义过程,这个过程应该在芹菜运行时一直运行。 芹菜工人将此过程用于他们的任务(不需要详细信息)。
我从命令行运行celery,一切正常:
celery -A celery_jobs.tasks.app worker -B --loglevel=warning
但是当我使用celeryd
守护芹菜时,没有办法阻止它。
命令celeryd stop
试图阻止芹菜,但永远不会结束。
当我在两种情况下检查进程树时,存在差异 - 当从命令行运行时,父进程显然是芹菜进程(主要进程将芹菜工作者作为子进程)。杀死(停止)父母芹菜过程将停止所有芹菜工人和我的自定义过程。
但是当使用celeryd
运行时,我的自定义进程有父/sbin/init
- 并且调用celeryd stop
无效 - 似乎主芹菜进程正在等待某些事情,或者无法停止我的自定义过程,因为它不是芹菜的子过程。
我对流程了解不多,而且查找信息并不容易,因为我不知道应该搜索什么,所以任何提示都会受到赞赏。
答案 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,那么您需要确保自定义进程处理它们。