supervisor 程式管理入門

Joey_Coder發表於2019-12-26

簡介

  • supervisor是一種客戶端/服務端系統,使用者可以使用supervisor控制在類UNIX系統下執行的諸多程式

  • 並且具有易用,高效,可擴充套件等諸多特性

  • supervisor包含supervisord伺服器元件和supervisorctl客戶端元件


安裝

  • pip安裝

    pip install supervisor

    如果pip需要系統許可權請在命令前加上sudo

  • 驗證安裝
    輸入以下命令,如果出現配置資訊的話,安裝應該成功了

    echo_supervisord_conf

使用

  • 例子引入

假設你有一個程式,名為A。以前的時候你只是在特定的檔案路徑下(/Users/joey/A_dir)終端透過命令啟動如下程式:

Istart A

這時候A程式就在後臺奔跑著。

但是這裡存在一個問題,開啟A程式的終端必須Alive,如果關閉程式或者掛機了,那麼A程式也就關閉了

於是你想著有沒有一種工具,可以幫你開啟A程式,並且不會佔用終端,且即便關閉了當前的終端A也能愉快的奔跑呢?
當你看到這篇文章時,你可能找到了一個可選項了:

supervisor!!!


  • supervisord服務元件配置

在你成功安裝了supervisor之後,你得先初始化服務元件supervisord的配置檔案

sudo touch /etc/supervisord.conf

上述命令建立配置檔案

sudo echo_supervisord_conf > /etc/supervisord.conf

上述命令將檔案內容匯入supervisord的配置檔案中
接下來我們來看看supervisord.conf的檔案內容

[unix_http_server]
file=/tmp/supervisor.sock   ; UNIX socket 檔案,supervisorctl 會使用
;chmod=0700                 ; socket 檔案的 mode,預設是 0700
;chown=nobody:nogroup       ; socket 檔案的 owner,格式: uid:gid

;[inet_http_server]         ; HTTP 伺服器,提供 web 管理介面
;port=127.0.0.1:9001        ; Web 管理後臺執行的 IP 和埠,如果開放到公網,需要注意安全性
;username=user              ; 登入管理後臺的使用者名稱
;password=123               ; 登入管理後臺的密碼

[supervisord]
logfile=/tmp/supervisord.log ; 日誌檔案,預設是 $CWD/supervisord.log
logfile_maxbytes=50MB        ; 日誌檔案大小,超出會 rotate,預設 50MB
logfile_backups=10           ; 日誌檔案保留備份數量預設 10
loglevel=info                ; 日誌級別,預設 info,其它: debug,warn,trace
pidfile=/tmp/supervisord.pid ; pid 檔案
nodaemon=false               ; 是否在前臺啟動,預設是 false,即以 daemon 的方式啟動
minfds=1024                  ; 可以開啟的檔案描述符的最小值,預設 1024
minprocs=200                 ; 可以開啟的程式數的最小值,預設 200

; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; 透過 UNIX socket 連線 supervisord,路徑與 unix_http_server 部分的 file 一致
;serverurl=http://127.0.0.1:9001 ; 透過 HTTP 的方式連線 supervisord

; 包含其他的配置檔案
;[include]
;files = relative/directory/*.ini    ; 可以是 *.conf 或 *.ini

";"是註釋符,我們將supervisord.conf檔案最下端的[include]前面的";"去掉,並將下面一句改為

file = /etc/supervisor/conf/*.conf    

至此,我們完成了服務元件的配置,當我們執行服務元件時,supervisor會到我們上面設定的file路徑尋找程式的配置檔案


  • 編寫A程式配置檔案

使用以下命令建立/etc/supervisor資料夾

sudo mkdir /etc/supervisor/conf

建立A.conf配置檔案

sudo vi /etc/supervisor/conf/A.conf

在A.conf輸入以下內容:

[program:A]  
directory = /Users/joey/A_dir ; 程式的啟動目錄
command = Istart A  ; 啟動命令,如果你想執行該目錄下的檔案,建議使用絕對路徑
autostart = flase     ; 在 supervisord 啟動的時候是否自動啟動
startsecs = 5        ; 啟動 5 秒後沒有異常退出,就當作已經正常啟動了
autorestart = true   ; 程式異常退出後自動重啟
startretries = 3     ; 啟動失敗自動重試次數,預設是 3
user = leon          ; 用哪個使用者啟動
redirect_stderr = true  ; 把 stderr 重定向到 stdout,預設 false
stdout_logfile_maxbytes = 20MB  ; stdout 日誌檔案大小,預設 50MB
stdout_logfile_backups = 20     ; stdout 日誌檔案備份數
; stdout 日誌檔案,需要注意當指定目錄不存在時無法正常啟動,所以需要手動建立目錄(supervisord 會自動建立日誌檔案)
stdout_logfile = /etc/supervisor/logs/A.log
stopasgroup = true
killasgroup = true   ;當主程式退出來,殺死相應的子程式

需要注意的是[program A]中的A是接下來啟動程式的標誌,具有唯一性

建立A程式的日誌檔案

sudo mkdir /etc/supervisor/logs
sudo touch /etc/supervisor/logs/A.log

  • 啟動supervisord服務元件

透過supervisord配置檔案啟動

supervisord -c /etc/supervisord.conf

可以透過ps命令是否成功啟動

ps aux | grep supervisor

  • supervisorctl客戶元件

當supervisord服務元件啟動後,我們可以使用supervisorctl客戶元件是來管理A程式
包括啟動,關閉,重新啟動,檢視當前狀態等。
我們可以使用以下命令啟動客戶端元件

supervisorctl -c /etc/supervisord.conf

進入客戶端程式後,我們可以使用start啟動程式A

start A

當你想重新啟動時可以

restart A

使用status可以檢視程式狀態

status

使用stop命令來關閉程式

stop A

如果你想以配置檔案的形式啟動A,那麼你可以修改/etc/supervisor/A.conf中的內容

command = Istart A -c /fileroute/filename

接下來回到supervisorctl中使用update命令重新載入程式檔案

update

然後重新啟動

restart A

關於A程式的執行內容,你可以透過檢視日誌獲知

tail -f /etc/supervisor/logs/A.log

參考文章

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章