これは、私が使用していた init スクリプトの問題のようです。セロリ デーモン プロセスに 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 ビルド スクリプトが実行されるたびに (ポスト コミットごとに) 偶然にも起こりました。