Supervisor — 進程管理系統介紹與基本設定示範
前言
來介紹一款由Python所編寫的進程管理系統 Supervisor。它算是比較簡易陽春型好上手的Process管理系統,一般適用於管理伺服器為主,例如需要重啟、停止、查看Log的需求,你就可以簡單的利用文檔方式,來控管不同的Process (或者我們可以說 service)。
來舉個小情境,今天有一個容器(Container)內啟動了諸多個server,但我想要同時監控不同server的log,以及單獨重新啟動某個有問題的server的時候,supervisor就是一個很方便的工具。簡單的安裝,不複雜的設定,由於我的服務也不大型,因此supervisor就會是一個很好的選擇。
安裝
Supervisor官方文檔網站 連結
本文安裝測試環境是 Ubuntu 18.04 / 20.04
sudo apt-get update && sudo apt-get install supervisor
當安裝完成之後,supervisor會在此路徑下 /etc/supervisor/
產生一些相關的檔案,也是用來設置放置管理進程的檔案地方。
文檔設定
Supervisor有提供一個網頁來做進程控管,啟動之後可以於瀏覽器輸入(ip):(port) 或者 0.0.0.0:(port) 進入控制中心頁面。
我們可以在 /etc/supervisor/
找到一個 supervisord.conf 文件,我們可以加入這段來做port的設定,包含安全性考量設定使用者帳號密碼也可以(進入控管頁面之前會要求輸入密碼)。
supervisord.conf 文檔解析
; supervisor config file
[unix_http_server]
file=/var/run/supervisor.sock ; (the path to the socket file)
chmod=0700 ; sockef file mode (default 0700)
[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
childlogdir=/var/log/supervisor ; (‘AUTO’ child log dir, default $TEMP)
; 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:///var/run/supervisor.sock ; use a unix:// URL for a unix socket
; The [include] section can just contain the “files” setting. This
; setting can list multiple files (separated by whitespace or
; newlines). It can also contain wildcards. The filenames are
; interpreted as relative to this file. Included files *cannot*
; include files themselves.
[include]
files = /etc/supervisor/conf.d/*.conf
麻煩加上以下這一段,才能於瀏覽器上查看各個process的狀況。
[inet_http_server]
port=*:9000
# username=user
# password=user
假設沒有需要做使用者名稱和密碼控管的話,可以不必啟動 username / password 的部份(這部份會影響api的使用)。
以我的範例來看,啟動服務之後可以於瀏覽器上輸入 0.0.0.0:9000 進入控管頁面。
如圖顯示,上面會顯示每個程序的狀態,運作正常就是綠色,停止運作(Stop)就是黃色,程序啟動有問題或失敗(Fatal)就是紅色。此外,可以點選Tail -f 來做查看每個程序的log,而log是需要於文檔內先定義好路徑,如果兩個程序指向到同一個log路徑,就會出問題(查看不到log)。
新增config檔案
我們可以增加更多的服務(或程式)在conf.d檔案夾裡面 (絕對路徑是 /etc/supervisor/conf.d
)
以下是範例:
創建一個檔案名稱為 httpsweb.conf 把它放在 conf.d 資料夾底下。
[program:httpsweb]
command=(put your service command here)
killasgroup=true
stopasgroup=true
autostart=true
autorestart=true
redirect_stderr=true
stdout_capture_maxbytes=1MB
stdout_events_enabled=true
stdout_syslog=true
stderr_capture_maxbytes=1MB
stderr_events_enabled=true
stderr_syslog=true
stderr_logfile=/var/log/web.err.log
stdout_logfile=/var/log/web.out.log
文檔解析
- [program:httpsweb] : 注意每當新增一個程式或者一個服務,簡單說一個新的.conf檔案,就需要給一個全新的名子,亦即更改裡面的名稱粗體字(httpsweb)部份要換掉。
- Command : 意思是你需要supervisor啟動的指令,可等同於terminal command line需要執行的指令,假如你有多餘一個指令以上的動作需要做處理,舉例來說:先創建某個檔案夾,進入在做啟動伺服器的動作等等。我的做法是於 /etc/supervisor/ 下創見一個專門放置腳本的資料夾 ex process,把你的sh script都放至於裡面,然後於command的部份去做執行此腳本,即可達到執行多個指令的目的。
- stderr_logfile 和 stdout_logfile 部份也需要給一個新的檔名,不可重複,不然在browser上查看log時候會出錯。
其他控制部份可以使用default值即可。
控制Supervisor服務
放置檔案,啟動
我的情境是,會於容器(Container)內做啟用supevisor服務,因此先準備好檔案,於製作image時放入,最後啟動容易的時候執行supervisord 即可。
cp -a conf.d/ /etc/supervisor/
cp supervisord.conf /etc/supervisor/supervisord.conf
chmod -R +x process/
/usr/bin/supervisord
停止
service supervisor restart
service supervisor start
service supervisor stop
API操作
一般服務的格式
http://(ip):9000/index.html?processname=(program name)&action=(type)括弧內的即為需要/可替換的:
- ip : 啟動該服務的電腦IP,也可以server IP等。如果測試為同台電腦,可輸入 0.0.0.0 即可。
- program name : 則是每個服務的名子,我們於httpsweb.conf 裡面所定義的。
- type : 可選擇 restart / stop / start
以下我的範例是讓httpsweb做重新啟動的動作:
http://0.0.0.0:9000/index.html?processname=httpsweb&action=restart這是對所有服務做一致的動作,例如全部重新啟動或者全部停止。
如此就可以用程式例如python的request來達到控制不同process的目的了。