一、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
八、結果展示