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)