Supervisor 安裝與使用

疯子丶pony發表於2024-04-02

一、Supervisor 介紹

Supervisor 是一個用 Python 編寫的程序管理工具,它可以用於監控和控制類 UNIX 作業系統上的多個程序。它是一個客戶端/伺服器系統,其中 Supervisor 的伺服器端稱為 supervisord,負責啟動管理的子程序、響應客戶端命令、重啟崩潰或退出的子程序、記錄子程序的 stdout 和 stderr 輸出,以及處理子程序生命週期中的事件。客戶端則稱為 supervisorctl,它提供了一個類 shell 的介面,允許使用者透過命令列與 supervisord 伺服器程序通訊,以控制子程序的狀態、啟動和停止程序,並獲取正在執行的程序列表。

Supervisor官網地址:http://supervisord.org/

二、安裝環境介紹

Linux:CentOS Linux release 7.6.1810 (Core)

Supervisor:supervisor-4.2.5

Python:Python 2.7.5

三、安裝 Supervisor

1、下載 supervisor 原始碼包【supervisor-4.2.5.tar.gz】

2、在根目錄新建一個名為【service】的目錄,並把【supervisor-4.2.5.tar.gz】包移入進去

# 新建目錄
mkdir service

# 解壓supervisor原始碼包
tar -zxvf supervisor-4.2.5.tar.gz

3、進入supervisor目錄,內容如下圖:

# 進入目錄
cd supervisor-4.2.5

# 檢視目錄下的檔案
ll

4、安裝 supervisor

# 安裝 supervisor
python setup.py install

5、使用幫助命令來檢測是否安裝成功,結果如下圖:

supervisorctl --help

四、配置 Supervisor

1、建立一個資料夾,用於儲存相關配置檔案

mkdir /etc/supervisor

2、使用命令,建立一個【Supervisor】配置檔案。

# 符合(>)右側的是配置檔案的路徑
echo_supervisord_conf > /etc/supervisor/supervisord.conf

3、找到 supervisord.conf 檔案,修改裡面的配置引數

# 原配置
[unix_http_server]
file=/tmp/supervisor.sock   ; the path to the socket file
;chmod=0700                 ; socket file mode (default 0700)
;chown=nobody:nogroup       ; socket file uid:gid owner
;username=user              ; default is no username (open server)
;password=123               ; default is no password (open server)

# 修改後的配置,原先的/tmp目錄下的內容容易被系統刪除,導致啟動失敗
[unix_http_server]
file=/var/run/supervisor.sock   ; the path to the socket file
;chmod=0700                 ; socket file mode (default 0700)
;chown=nobody:nogroup       ; socket file uid:gid owner
;username=user              ; default is no username (open server)
;password=123               ; default is no password (open server)

------------------------------------------------------------------------------

# 原配置
[supervisord]
logfile=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log
logfile_maxbytes=50MB        ; max main logfile bytes b4 rotation; default 50MB
logfile_backups=10           ; # of main logfile backups; 0 means none, default 10
loglevel=info                ; log level; default info; others: debug,warn,trace
pidfile=/tmp/supervisord.pid ; supervisord pidfile; default supervisord.pid
nodaemon=false               ; start in foreground if true; default false
silent=false                 ; no logs to stdout if true; default false
minfds=1024                  ; min. avail startup file descriptors; default 1024
minprocs=200                 ; min. avail process descriptors;default 200


# 修改後的配置,修改了服務的日誌檔案目錄,修改了supervisord.pid的存放位置
[supervisord]
logfile=/etc/supervisor/log/supervisord.log    ; 避免被系統刪除
logfile_maxbytes=50MB        ; max main logfile bytes b4 rotation; default 50MB
logfile_backups=10           ; # of main logfile backups; 0 means none, default 10
loglevel=info                ; log level; default info; others: debug,warn,trace
pidfile=/var/run/supervisord.pid    ; 避免被系統刪除
nodaemon=false               ; start in foreground if true; default false
silent=false                 ; no logs to stdout if true; default false
minfds=1024                  ; min. avail startup file descriptors; default 1024
minprocs=200                 ; min. avail process descriptors;default 200

------------------------------------------------------------------------------

# 原配置
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket
;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
;username=chris              ; should be same as in [*_http_server] if set
;password=123                ; should be same as in [*_http_server] if set
;prompt=mysupervisor         ; cmd line prompt (default "supervisor")
;history_file=~/.sc_history  ; use readline history if available

# 修改後的配置,修改supervisor.sock的存放位置,避免被系統刪除
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock
;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
;username=chris              ; should be same as in [*_http_server] if set
;password=123                ; should be same as in [*_http_server] if set
;prompt=mysupervisor         ; cmd line prompt (default "supervisor")
;history_file=~/.sc_history  ; use readline history if available

------------------------------------------------------------------------------

# 原配置
;[include]
;files = relative/directory/*.ini


# 修改後的配置,設定子任務的配置檔案目錄
[include]
files = /etc/supervisor/conf.d/*.ini

4、儲存退出後更新配置檔案,如果之前沒啟動過服務可以不用更新

supervisorctl -c /etc/supervisor/supervisord.conf update

五、配置 Supervisor 的子任務

進入到【/etc/supervisor/conf.d】目錄,建立名為【test.ini】的子任務,並寫入如下內容:

#進入子任務配置檔案目錄
cd /etc/supervisor/conf.d

#建立子任務配置檔案
touch test.ini

#編輯配置檔案
vi test.ini

#配置檔案中的具體內容
[program:test]        ;要和檔名稱相同
command=/usr/local/php74/bin/php think testJob        ;啟動該程式時將執行的命令,我這用的是TP框架中的think命令
directory=/www/school-task        ;表示command命令的執行目錄,本文用的時候TP框架,school-task為專案名稱
autorestart=true        ;自動重啟
startsecs=3        ;啟動後程式需要保持執行的總秒數,以認為啟動成功(將程序從STARTING狀態移動到running狀態)。設定為0表示程式不需要在任何特定的時間內保持執行
startretries=3        ;啟動失敗時的最多重試次數
stdout_logfile=/etc/supervisor/log/test.out.log     ;輸出日誌檔案路徑
stderr_logfile=/etc/supervisor/log/test.err.log        ;錯誤日誌檔案路徑
stdout_logfile_maxbytes=2MB        ;設定stdout_logfile的檔案大小
stderr_logfile_maxbytes=2MB        ;設定stderr_logfile的檔案大小
user=root        ;指定執行的使用者
priority=999        ;程式在啟動和關閉順序中的相對優先順序
numprocs=1
process_name=%(program_name)s_%(process_num)02d

六、supervisord相關操作命令

#啟動supervisord
supervisord -c /etc/supervisor/supervisord.conf

#關閉supervisord
supervisorctl -c /etc/supervisor/supervisord.conf shutdown

#檢視supervisord管理的程序,【all】是可選引數,表示檢視所有的子任務
supervisorctl -c /etc/supervisor/supervisord.conf status all

#重新載入配置
supervisorctl -c /etc/supervisor/supervisord.conf update

#重新啟動supervisord
supervisorctl -c /etc/supervisor/supervisord.conf reload

#停止supervisord管理的程序,【process_name】表示子任務名稱 supervisorctl -c /etc/supervisor/supervisord.conf stop process_name #啟動supervisord管理的程序,【process_name】表示子任務名稱 supervisorctl -c /etc/supervisor/supervisord.conf start process_name

七、新增supervisord的systemctl服務命令和開機自啟

1、新建一個服務檔案【/usr/lib/systemd/system/supervisord.service】,寫入以下內容:

[Unit]
Description=Supervisor daemon

[Service]
#表示systemd應該以forking模式啟動服務。在此模式下,systemd會啟動一個父程序,然後父程序會fork出一個或者多個子程序。
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
ExecStop=/usr/bin/supervisorctl -c /etc/supervisor/supervisord.conf shutdown
ExecReload=/usr/bin/supervisorctl -c /etc/supervisor/supervisord.conf reload
ExecStatus=/usr/bin/supervisorctl -c /etc/supervisor/supervisord.conf status
ExecRestart=/usr/bin/supervisorctl -c /etc/supervisor/supervisord.conf restart
#表示當systemd需要停止服務時,它會傳送訊號到服務的主程序。如果服務有子程序,那麼子程序不會收到這個訊號。
KillMode=process
#表示當服務非正常退出時(例如收到SIGKILL訊號),systemd會嘗試重啟服務。
Restart=on-failure
#如果服務失敗了,systemd會在嘗試重啟服務前等待30秒
RestartSec=30s
#指定執行服務的使用者
User=root

[Install]
WantedBy=multi-user.target

2、重新載入配置檔案

systemctl daemon-reload

3、配置系統開機啟動

systemctl enable supervisord.service

4、systemctl 操作命令

# 啟動supervisord
systemctl start supervisord.service

# 檢視supervisord狀態
systemctl status supervisord.service

# 重啟supervisord
systemctl restart supervisord.service

# 停止supervisord
systemctl stop supervisord.service

# 過載配置
systemctl reload supervisord.service

八、結果展示

相關文章