这似乎是我使用的初始化脚本的问题。当向 celery 守护进程发送 SIG TERM 信号时,它不会杀死工作人员。它使工作人员处于等待中介者将任务提供给池的状态,但 SIG TERM 会杀死中介者。
看看我在下面找到的调试语句:
[2013-01-02 16:23:58,624: DEBUG/MainProcess] Terminating celery.worker.consumer.Consumer...
[2013-01-02 16:23:58,624: DEBUG/MainProcess] consumer: Stopping consumers...
[2013-01-02 16:23:58,625: DEBUG/MainProcess] Terminating celery.worker.mediator.Mediator...
[2013-01-02 16:23:59,034: DEBUG/MainProcess] Terminating celery.concurrency.processes.TaskPool...
[2013-01-02 16:23:59,050: DEBUG/MainProcess] Terminating celery.worker.hub.Hub...
[2013-01-02 16:23:59,050: DEBUG/MainProcess] consumer: Closing consumer channel...
[2013-01-02 16:23:59,051: DEBUG/MainProcess] consumer: Closing broadcast channel...
解决方法是将 SIG TERM 信号也发送到所有工作进程。
if [ $(ps aux | grep -c 'celery') -eq 1 ] ; then
ps auxww | grep celeryd | grep -v "grep" | awk '{print $2}' | sudo xargs kill -HUP
fi
每次我们的 jenkins 构建脚本运行时(每次提交后)都会发生这种情况。