-
簡介
supervisor 是用 Python 開發的一套通用的程序管理程式,能将一個普通的指令行程序變為背景 daemon,并監控程序狀态,異常退出時能自動重新開機。它是通過 fork/exec 的方式把這些被管理的程序當作 supervisor 的子程序來啟動,這樣隻要在 supervisor 的配置檔案中,把要管理的程序的可執行檔案的路徑寫進去即可。也實作當子程序挂掉的時候,父程序可以準确擷取子程序挂掉的資訊的,可以選擇是否自己啟動和報警。supervisor 還提供了一個功能,可以為supervisord 或者每個子程序,設定一個非 root 的 user,這個 user 就可以管理它對應的程序。
-
使用
近期,由于業務需求,使用了 rabbitmq 消息隊列,本地指令行測試無問題,放在伺服器背景執行,隔一段時間就會挂掉,查詢資料,最後選中
supervisor 管理 rabbitmq 消費隊列常駐程序,可以在程序異常退出的時候自動重新開機。
原以為問題解決,誰知,消費消息時還是過一段時間挂掉,挂掉的時候重新開機 supervisor 對應的程序即可恢複,可是為什麼程序停止時 supervisor 重新開機呢?
帶着這個疑問,繼續查找資料,發現
當程序意外被 kill 或出現異常時,Supervisor會自動重新開機該程序。
但如果 supervisor 監控的程序出現記憶體洩漏或連接配接不自動釋放的情況,supervisor 并不會執行重新開機
原來如此…
那就需要定期重新開機指定的程序,可是 supervisor 不支援定期自動重新開機,那就定時任務吧。
-
supervisor 定期重新開機指定程序
比如每小時重新開機程序 test
0 * * * * supervisorctl restart test
如果提示 supervisorctl: command not found
在根目錄下使用 find -name supervisorctl 查找檔案位置
我的是 /www/server/panel/pyenv/bin/supervisorctl
0 * * * * /www/server/panel/pyenv/bin/supervisorctl restart test
完美解決問題!!!