Ubuntu

Celery with Upstart - 程序意外死亡

  • April 28, 2016

當我用 Upstart 執行 Celery 時,一段時間後,子程序或主程序死掉了,沒有任何痕跡。

我正在使用的 Upstart 腳本(/etc/init/celery):

description "celery"

start on runlevel [2345]
stop on runlevel [!2345]

kill timeout 20
# console log
setuid ***
setgid ***

script
chdir /opt/***/project/
exec /opt/***/virtualenvs/***/bin/python manage.py celery worker --settings=settings.staging -B -c 4 -l DEBUG
end script

respawn

在沒有新貴的情況下執行完全相同的命令(手動執行exec元件)時,一切正常。

使用該respawn節,主程序將死亡並重新生成,而失去的子程序仍然存在,從而導致記憶體溢出。沒有它,流程將消失,直到沒有工人離開。

Celery 產生一個主程序和工作程序(在本例中為 4 個)。我還嘗試使用eventlet而不是多處理(1 個主程序,1 個子程序)來執行它,但結果是相似的。

以前有沒有人遇到過這種行為?


更新:

  • Celery 執行時-c NN + 2程序開始,N其中是工人(另外兩個是什麼?)。
  • 我開始認為這與expect節有關,但不確定該值應該是什麼。eventlet expect fork有道理。但是多處理呢?

更新2:

使用except fork似乎可以阻止處理死亡,但在嘗試停止或重新啟動作業時它只是掛起。

chdir在子句內部使用script是完全錯誤的,這意味著您無法理解 upstart 中的一個非常基本的概念(沒有冒犯的意思)。(作為旁注,exec關鍵字只是無用,但沒有害處)。

有一個非常核心的想法可以理解暴發戶的工作方式。Upstart 嘗試確定由該script節生成的程序中的哪個程序是該服務的實際守護程序。然後,它使用此過程來確定此作業是否正在執行或停止或失敗或其他。因此,確保流程正確至關重要。

確定過程的算法非常簡單,它取決於expect節。意思是“在節expect fork中取第二個叉子”, –相同,但第三個。script``expect daemon

現在,使用chdirinsidescript意味著它呼叫了實際的/bin/chdir二進製文件,這算作一個單獨的分叉。你需要做的是將它移到script節之外,而不是玩expect節,直到你做對為止。您可以通過比較 的輸出來檢查是否initctl status celery正確ps。PID 應該匹配。

引用自:https://serverfault.com/questions/541607