1

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

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

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

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

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

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

我对流程了解不多,也不容易找到信息,因为我不知道我应该搜索什么,所以任何提示都值得赞赏。

4

2 回答 2

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 秒后没有停止,这是一个长时间停止的候选,所以我决定突然停止

于 2014-06-16T13:56:23.597 回答
0

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

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

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

当您终止 supervisord 进程(使用 -TERM)时,它将负责终止所有工作人员和您的自定义进程。如果您使用 -TERM,则需要确保您的自定义进程处理它们。

于 2014-06-17T10:32:42.667 回答