天天看點

Supervisor 定期重新開機指定程序

  1. 簡介

    supervisor 是用 Python 開發的一套通用的程序管理程式,能将一個普通的指令行程序變為背景 daemon,并監控程序狀态,異常退出時能自動重新開機。它是通過 fork/exec 的方式把這些被管理的程序當作 supervisor 的子程序來啟動,這樣隻要在 supervisor 的配置檔案中,把要管理的程序的可執行檔案的路徑寫進去即可。也實作當子程序挂掉的時候,父程序可以準确擷取子程序挂掉的資訊的,可以選擇是否自己啟動和報警。supervisor 還提供了一個功能,可以為supervisord 或者每個子程序,設定一個非 root 的 user,這個 user 就可以管理它對應的程序。

  2. 使用

    近期,由于業務需求,使用了 rabbitmq 消息隊列,本地指令行測試無問題,放在伺服器背景執行,隔一段時間就會挂掉,查詢資料,最後選中

    supervisor 管理 rabbitmq 消費隊列常駐程序,可以在程序異常退出的時候自動重新開機。

    原以為問題解決,誰知,消費消息時還是過一段時間挂掉,挂掉的時候重新開機 supervisor 對應的程序即可恢複,可是為什麼程序停止時 supervisor 重新開機呢?

    帶着這個疑問,繼續查找資料,發現

    當程序意外被 kill 或出現異常時,Supervisor會自動重新開機該程序。

    但如果 supervisor 監控的程序出現記憶體洩漏或連接配接不自動釋放的情況,supervisor 并不會執行重新開機

    原來如此…

    那就需要定期重新開機指定的程序,可是 supervisor 不支援定期自動重新開機,那就定時任務吧。

  3. 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
           

完美解決問題!!!