"celeryd stop"不起作用



我正在以一种不寻常的方式使用芹菜-当芹菜启动时,我正在创建自定义进程,这个进程应该在芹菜运行时一直运行。芹菜工人使用这个过程来完成他们的任务(细节不需要)。

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

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

但是当我使用celeryd来守护芹菜时,没有办法阻止它。命令celeryd stop试图停止芹菜,但从未结束。

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

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

我不太了解流程,查找信息也不容易,因为我不知道我应该搜索什么,所以任何提示都很感谢。

我也遇到过同样的问题。我需要一个快速的解决方案,所以我编写了这个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秒后没有停止,那么它是一个长时间停止的候选,所以我决定突然停止

我假设您的自定义进程不是任何池工作进程的子进程,也不需要这样。

我用监督而不是命令来管理工人。它也可以用于守护其他进程。例如您的自定义流程。

在你的例子中,你的supervisor .conf可以有多个部分。一个用于每个芹菜工作节点,一个(或多个)用于您的定制进程。

当你终止监督进程时(使用-TERM),它会终止所有的工人和你的自定义进程。如果您使用-TERM,那么您将需要确保您的自定义进程处理它们。

最新更新