2012-04-02 75 views
11

發出TERM信號給芹菜工人兩次使用CTLR-C鍵盤中斷(熱關機和冷停堆)後,芹菜工人只掛了。它不消耗消息或執行任務(如預期),但也不會關閉。爲什麼芹菜不乾淨地關閉?

我跑了芹菜過程strace,看看發生了什麼事情的幕後。下面是對芹菜主要過程

strace -p 27867 
Process 27867 attached - interrupt to quit 
futex(0xb966a78, FUTEX_WAIT, 0, NULL 

這裏的PID的strace輸出是我的發現做strace的子進程:

strace -p 27874 
Process 27874 attached - interrupt to quit 
select(4, [3], NULL, NULL, {0, 562000}) = 0 (Timeout) 
futex(0x871a808, FUTEX_WAKE, 1)   = 0 
select(4, [3], NULL, NULL, {1, 0})  = 0 (Timeout) 
futex(0x871a808, FUTEX_WAKE, 1)   = 0 
...................................................... 

我知道我可以發出KILL信號給進程擺脫他們。但我很想知道什麼能夠阻止這些進程被關閉,以及是否有可能對此做些什麼。

軟件堆棧:Python的2.6.2,芹菜2.4.6,CentOS的5.0

UPDATE:CPU使用率下降到幾乎爲0%。這些任務的CPU密集程度相當高,因此確認當前沒有任何活動。

回答

3

docs

如果工人不關機體貼時間後,例如 因爲停留在一個無限循環任務,可以使用KILL 信號強制終止工作,但請注意,目前執行任務的 將會丟失(除非任務設置了acks_late 選項)。

同樣來自google groups

celeryd不會關閉,直到所有活動任務已被處理,其中 活躍意味着,已經開始(不是所有 保留的任務外)的任務。一旦連接通道關閉,預留的消息將被釋放並且 被重新遞送。活動任務返回後發生 。如果您沒有 - 啓用時間限制的celeryd不會在關機時終止您的任務,即使他們需要完成DAYS。

+2

沒有活動的任務。發出停止信號時運行的任務已完成。隊列長度保持不變。沒有什麼會被輸出到日誌。但流程仍未終止。 正如我所說,我*可以*發出殺戮並擺脫它們。但這不會是一個有效的解決方案。爲了可靠地使用該軟件,我需要能夠自動停止(並啓動)它,而不需要手動干預。 – rubayeet 2012-04-02 10:57:52

+1

一個很好的解決方案是將芹菜進行守護。 Supervisord是一個很好的候選人。 – hymloth 2012-04-02 11:14:27

+1

我使用通用init腳本來守護工作者:https://github.com/ask/celery/blob/master/contrib/generic-init.d/celeryd – rubayeet 2012-04-02 11:22:28