celeryd stop" 无法工作
我在用celery的方式有点特别——我在celery启动时创建了一个自定义进程,这个进程应该在celery运行的时候一直保持运行。celery的工作者会用这个进程来完成他们的任务(具体细节就不说了)。
我从命令行运行celery,一切都很正常:
celery -A celery_jobs.tasks.app worker -B --loglevel=warning
但是当我用celeryd
来让celery在后台运行时,就没有办法停止它了。命令celeryd stop
试图停止celery,但总是停不下来。
我检查了两种情况下的进程树,发现了不同之处——从命令行运行时,父进程显然是celery进程(主进程,下面有celery工作者作为子进程)。如果我杀掉(停止)这个父celery进程,就会停止所有的celery工作者和我的自定义进程。
但是当用celeryd
运行时,我的自定义进程的父进程是/sbin/init
——而调用celeryd stop
并没有效果——看起来主celery进程在等待什么,或者无法停止我的自定义进程,因为它并不是celery的子进程。
我对进程的了解不多,找信息也不容易,因为我不知道该搜索什么,所以任何建议都很受欢迎。
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秒后还没有停止,那就说明它可能需要很长时间才能停止,所以我决定强制停止它。
我猜你自定义的进程并不是你工作池中的任何一个工作进程的子进程,也不需要这样。
我使用 supervisord 来管理工作进程,而不是用 celeryd。supervisord 不仅可以管理工作进程,还可以管理其他进程,比如你自定义的进程。
在你的情况下,supervisord.conf 文件可以有多个部分。每个部分对应一个 celery 工作节点,还有一个(或多个)部分用来配置你的自定义进程。
当你用 -TERM 命令结束 supervisord 进程时,它会负责结束所有的工作进程和你的自定义进程。如果你使用 -TERM,那么你需要确保你的自定义进程能够正确处理这个结束信号。