Supervisord 是 Linux 上常用的 daemon 監控工具,可以使用他來啟動並監控 daemon,若 daemon 因為任何的狀況消失,可以進行重啟並且記錄。
首先我們手動建立一個 daemon。
/tmp/test.sh
while true do echo test sleep 1 done
接著來建立配置檔案。
/etc/supervisor/conf.d/test.conf
[program:test] command = bash /tmp/test.sh autostart = true autorestart = true
配置完成後,執行相關指令使用。
$ sudo supervisorctl status # 這個時候是空的 $ sudo supervisorctl reload Restarted supervisord $sudo supervisorctl status test STARTING # 我們可以看到剛才配置的 test.conf 已經生效了 $ ps -aux | grep test root 5884 0.0 0.3 8696 3352 ? S 01:27 0:00 bash /tmp/test.sh # 利用 ps 來看他也確實在背景運作 $ sudo kill -9 5884 # 我們把這個 daemon process 砍掉 $ ps -aux | grep test root 6107 0.0 0.3 8696 3468 ? S 01:29 0:00 bash /tmp/test.sh # 可以看到這個 daemon 重新啟動並且更換了 process id,表示原本的 process 有被我們砍掉,'但 supervisord 又把他啟動了
如果有添加新的 config,建議使用 sudo supervisorctl update
做單一配置更新,使用 reload
的話所有的 process 會重新啟動,如果是跑 queue 之類的 process 怕造成不可預期的後果。
配置內容
command=/bin/cat ; 程式執行命令,建議使用絕對路徑。 process_name=%(program_name)s ; 程式名稱,可用的變數有 `group_name`, `host_node_name`, `process_num`, `program_name`, `here`(配置檔案目錄)。 一般程式需要執行多個副本的情況會使用。後面會有例子。 numprocs=1 ; 程式執行的副本個數,預設為1,如果值大於1,則`process_name` 必須包含 `%(process_num)s` numprocs_start=0 ; `%(process_num)s`起始數字,預設為0 00=/tmp ; 程式執行的所在目錄,相當於先cd到指定目錄,然後執行程式。 umask=022 ; umask for process (default None) priority=999 ; 程式操作的的優先順序,例如在start all/stop all,高優先順序的程式會先關閉和重啟。 autostart=true ; 在supervisord啟動時自動啟動,預設為true startsecs=1 ; 程式啟動前等待時間等待時間。預設為1。 startretries=3 ; 嘗試重啟最大次數。預設為3。 autorestart=unexpected ; 是否自動重啟,可選引數為 false, unexpected, true。如果為false則不自動重啟,如果為unexpected表示如果程式退出訊號不在 `exitcodes` 中,則自動重啟。預設為unexpected exitcodes=0,2 ; 程式退出碼。配合`autorestart`使用。預設為 0,2 stopsignal=QUIT ; 殺死程序是傳送的訊號,預設為TREM。 stopwaitsecs=10 ; 傳送SIGKILL訊號前最大等待時間。預設為10。 user ; 以指定使用者身份啟動程式。預設為當前使用者。 stopasgroup=false ; 是否向子程序傳送停止訊號,這對於Flask的debug模式很有用處,如果設定為true,則不向子程序傳送停止訊號。預設為false killasgroup=false ; 是否向子程序傳送kill訊號,預設為false redirect_stderr=false ; 將錯誤輸出定向到標準輸出,預設為false stdout_logfile=/a/path ; 標準輸出日誌路徑,可選引數為 `自定義` `AUTO` `NONE`,`自定義`將日誌寫到自定義路徑,可用的變數有`group_name`, `host_node_name`, `process_num`, `program_name`, `here`(配置檔案目錄);`NONE`不建立日誌;`AUTO` 又supervisord自動選擇路徑,並且當supervisord服務重新啟動時原來自動建立的日誌以及日誌的備份檔案會被刪除。預設為AUTO stdout_logfile_maxbytes=1MB ; 標準輸出日誌單個檔案最大大小,如果超過指定大小會將日誌檔案備份,可用的單位 KB MB GB。如果設定為0則表示不限制檔案大小。預設為50MB stdout_logfile_backups=10 ; 標準輸出日誌檔案最大備份數。預設為10 stdout_capture_maxbytes=1MB ; 當程序處於“stdout capture mode”模式下寫入到FIFO佇列最大位元組數,可用單位 KB MB GB。預設為0,詳細說明見[capture-mode](http://supervisord.org/logging.html#capture-mode) stdout_events_enabled=false ; ;以下配置項配置錯誤輸出的日誌引數。和上面標準輸出配置相同。 stderr_logfile=/a/path ; stderr_logfile_maxbytes=1MB ; stderr_logfile_backups=10 ; stderr_capture_maxbytes=1MB ; stderr_events_enabled=false ; environment=A="1",B="2" ; 環境變數設定,可用的變數有 `group_name`, `host_node_name`, `process_num`, `program_name`, `here`。 預設為空。 serverurl=AUTO ; override serverurl computation (childutils)