2022/09/18

Supervisord

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)

參考網站