Celery with Upstart - 程序意外死亡
當我用 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 N
從N + 2
程序開始,N
其中是工人(另外兩個是什麼?)。- 我開始認為這與
expect
節有關,但不確定該值應該是什麼。eventlet
expect fork
有道理。但是多處理呢?更新2:
使用
except fork
似乎可以阻止處理死亡,但在嘗試停止或重新啟動作業時它只是掛起。
chdir
在子句內部使用script
是完全錯誤的,這意味著您無法理解 upstart 中的一個非常基本的概念(沒有冒犯的意思)。(作為旁注,exec
關鍵字只是無用,但沒有害處)。有一個非常核心的想法可以理解暴發戶的工作方式。Upstart 嘗試確定由該
script
節生成的程序中的哪個程序是該服務的實際守護程序。然後,它使用此過程來確定此作業是否正在執行或停止或失敗或其他。因此,確保流程正確至關重要。確定過程的算法非常簡單,它取決於
expect
節。意思是“在節expect fork
中取第二個叉子”, –相同,但第三個。script``expect daemon
現在,使用
chdir
insidescript
意味著它呼叫了實際的/bin/chdir
二進製文件,這算作一個單獨的分叉。你需要做的是將它移到script
節之外,而不是玩expect
節,直到你做對為止。您可以通過比較 的輸出來檢查是否initctl status celery
正確ps
。PID 應該匹配。