天天看點

進階必備 | Linux系統管理工具 supervisor 詳解,代碼齊全可複制

作者:老男孩IT教育

supervisor是一個程序管理工具,當程序中斷的時候supervisor能自動重新啟動它,同時,它也是一個用戶端/伺服器系統,允許使用者在類unix作業系統上控制多個程序。

supervisor是用Python開發的一套通用的程序管理程式,能将一個普通的指令行程序變為背景daemon,并監控程序狀态,異常退出時能自動重新開機。

supervisor是通過fork/exec的方式把這些被管理的程序當作supervisor的子程序來啟動,這樣隻要在supervisor的配置檔案中,把要管理的程序的可執行檔案的路徑寫進去即可。

可實作當子程序挂掉的時候,父程序可以準确擷取子程序挂掉的資訊的,可以選擇是否自己啟動和報警。

supervisor還提供了一個功能,可以為supervisord或者每個子程序,設定一個非root的user,這個user就可以管理它對應的程序。

supervisor程序管理服務組成

supervisor主要包括以下四個核心部分組成:

  • supervisord

這是supervisor服務的主要管理器,運作 Supervisor 時會啟動一個程序 supervisord,它負責啟動所管理的程序;

并将所管理的程序作為自己的子程序來啟動,而且可以在所管理的程序出現崩潰時自動重新開機。

  • supervisorctl

這是supervisor服務的用戶端指令行工具,可以用來執行stop、start、restart等指令,來對這些子程序進行管理。

  • web Server

這是supervisor服務的網頁可視化界面,可以通過web界面檢視和控制程序狀态,簡化了對操作指令的學習;

  • xml-rpc interface

服務與web ui的同一個http伺服器,提供一個xml-rpc接口,可以用來詢問和控制管理程式及其他運作的程式;

supervisor服務運作環境說明

supervisor可以運作在大多數類unix系統,但是不能運作在任何windows系統,supervisor運作在python環境中;

可以在python2(2.7)版本上工作、python3(3.4)版本上工作、以及更高python版本上。

程序管理服務部署

程序管理服務安裝過程

安裝過程第一步:安裝python工具

[root@xiaoQ ~]# yum install -y python-pip           

安裝過程第二步:安裝supervisor程式

[root@xiaoQ ~]# pip install supervisor           

安裝過程第三步:核心确認supervisor是否安裝成功

[root@xiaoQ~]# echo_supervisord_conf
-- 通過執行以上指令,通過輸出資訊可以确認supervisor服務是否安裝成功           

程序管理服務配置資訊

supervisor程序管理服務程式安裝完畢後,會在系統中生成兩個主要的配置檔案:

主程序配置檔案:/etc/supervisord.conf

子程序配置檔案:/etc/supervisord.d/

子程序配置檔案資訊解析:

給需要管理的子程序(程式)編寫一個配置檔案,放在/etc/supervisor.d/目錄下,以.ini作為擴充名;

每個程序的配置檔案都可以單獨分拆也可以把相關的腳本放一起;

任意定義一個和腳本相關的項目名稱的選項組,例如:/etc/supervisord.d/test.conf

#項目名
[program:tomcat]  
#腳本目錄
directory=/opt/bin
#腳本執行指令
command=/usr/bin/python /opt/bin/test.py

#supervisor啟動的時候是否随着同時啟動,預設True
autostart=true
#當程式exit的時候,這個program不會自動重新開機,預設unexpected,設定子程序挂掉後自動重新開機的情況,有三個選項,false,unexpected和true。如果為false的時候,無論什麼情況下,都不會被重新啟動,如果為unexpected,隻有當程序的退出碼不在下面的exitcodes裡面定義的
autorestart=false
#這個選項是子程序啟動多少秒之後,此時狀态如果是running,則我們認為啟動成功了。預設值為1
startsecs=1

#腳本運作的使用者身份 
user = test

#日志輸出 
stderr_logfile=/tmp/blog_stderr.log 
stdout_logfile=/tmp/blog_stdout.log 
#把stderr重定向到stdout,預設 false
redirect_stderr = true
#stdout日志檔案大小,預設 50MB
stdout_logfile_maxbytes = 20MB
#stdout日志檔案備份數
stdout_logfile_backups = 20           

子程序配置示例:

[program:test] 
directory=/opt/bin 
command=/opt/bin/test
autostart=true 
autorestart=false 
stderr_logfile=/tmp/test_stderr.log 
stdout_logfile=/tmp/test_stdout.log 
#user = test           

程序管理服務指令使用

在使用supervisor程序管理工具時,也會經常用到一些指令對工具進行管理控制:

序号指令資訊作用說明01supervisorctl status檢視所有程序的狀态02supervisorctl stop es停止es服務程式03supervisorctl start es啟動es服務程式04supervisorctl restart es重新開機es服務程式05supervisorctl update配置檔案修改後使用該指令加載新的配置06supervisorctl reload重新啟動配置中的所有程式

把es換成all可以管理配置中的所有程序。

直接輸入supervisorctl進入supervisorctl的shell互動界面,此時上面的指令不帶supervisorctl可直接使用。

程序管理服務啟動應用

使用supervisor程序管理指令之前需要先啟動supervisord,啟動方法如下:

# 利用指令啟動服務程式
supervisord -c /etc/supervisord.conf

# 利用systemd管理啟動服務
systemctl start supervisord.service    
-- 啟動supervisor并加載預設配置檔案
systemctl enable supervisord.service    
-- 将supervisor加入開機啟動項

# 确認服務是否啟動
ps -ef|grep supervisor
root      12931      1  0 18:16 ?        00:00:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisord.conf
supervisorctl status
-- 執行以上指令資訊,輸出資訊為空,表示沒有配置項目資訊,但服務部署過程基本完成           

程序管理服務程序

程序管理應用實戰-Nginx

supervisor服務項目建立

為了示範實作supervisor服務的功能,可以臨時部署一個nginx服務程式,對nginx服務的程序進行監控;

下載下傳安裝nginx程式包:

yum install -y nginx           

supervisor服務項目配置

修改上面說明的supervisord.conf檔案,檔案最後兩行配置資訊的注釋取消掉,也就是去掉分号資訊:

[include]
files = supervisord.d/*.ini
-- 指定需要加載的程式項目配置檔案資訊           

建立一個測試使用的服務配置檔案:nginx.ini

[root@xiaoQ supervisord.d]# cat nginx.ini 
[program:nginx]
directory=/usr/sbin/
command=/usr/sbin/nginx -g 'daemon off;'
autostart=true
autorestart=true
startsecs=3

user=root
stderr_logfile=/tmp/nginx_stderr.log 
stdout_logfile=/tmp/nginx_stdout.log           

supervisor服務重新啟動

編寫完supervisor管理的程序服務配置檔案後,可以使supervisor服務重新啟動,加載編寫的服務配置檔案;

# 重新開機supervisor服務程式
systemctl restart supervisord.service  

# 檢查對應管理的服務程式是否啟動
[root@docker-server supervisord.d]# ps -ef|grep nginx
root       13338  13317  0 22:12 ?        00:00:00 nginx: master process /usr/sbin/nginx -g daemon off;
nginx     13339  13338  0 22:12 ?        00:00:00 nginx: worker process
nginx     13340  13338  0 22:12 ?        00:00:00 nginx: worker process
nginx     13341  13338  0 22:12 ?        00:00:00 nginx: worker process
nginx     13342  13338  0 22:12 ?        00:00:00 nginx: worker process           

通過web界面檢視服務程序運作情況:

進階必備 | Linux系統管理工具 supervisor 詳解,代碼齊全可複制

supervisor服務修複測試

嘗試殺掉nginx服務程式,模拟企業服務異常情況崩潰,檢視supervisor服務是否能夠自動重新開機nginx程式:

# 嘗試模拟殺死程序
[root@docker-server supervisord.d]# kill 13338
-bash: kill: (13338) - No such process

# 查詢nginx服務程序是否可以自動重新開機
[root@docker-server supervisord.d]# ps -ef|grep nginx
root       13346  13317  0 22:16 ?        00:00:00 nginx: master process /usr/sbin/nginx -g daemon off;
nginx     13347  13346  0 22:16 ?        00:00:00 nginx: worker process
nginx     13348  13346  0 22:16 ?        00:00:00 nginx: worker process
nginx     13349  13346  0 22:16 ?        00:00:00 nginx: worker process
nginx     13350  13346  0 22:16 ?        00:00:00 nginx: worker process
-- 可以根據重新開機服務程序号資訊可知,nginx服務已經實作了重新開機           

程序管理應用實戰-tomcat

supervisor服務項目建立

為了示範實作supervisor服務的功能,可以臨時部署一個tomcat服務程式,對tomcat服務的程序進行監控;

下載下傳安裝jdk8程式包:

yum -y install java-1.8.0-openjdk java-1.8.0-openjdk-devel           

設定配置jdk8環境變量:

# 編寫環境變量配置檔案
vim /etc/profile.d/java8.sh
export JAVA_HOME=$(dirname $(dirname $(readlink $(readlink $(which javac)))))
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/jre/lib:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar

# 加載環境變量配置資訊
source /etc/profile.d/java8.sh

# 檢查環境變量是否生效
echo $JAVA_HOME
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.352.b08-2.el7_9.x86_64
或者
printenv JAVA_HOME
/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.352.b08-2.el7_9.x86_64           

檢查jdk8程式包是否安裝成功:

[root@xiaoQ ~]# java -version
openjdk version "1.8.0_352"
OpenJDK Runtime Environment (build 1.8.0_352-b08)
OpenJDK 64-Bit Server VM (build 25.352-b08, mixed mode)
[root@xiaoQ ~]# javac -version
javac 1.8.0_352           

下載下傳安裝tomcat程式:

[root@xiaoQ ~]# cd /usr/local/
[root@xiaoQ ~]# rz -y
-- 将從官方下載下傳的tomcat程式包上傳此目錄中

# 解壓tomcat程式壓縮包
[root@xiaoQ local]# tar xf apache-tomcat-8.5.83.tar.gz           

supervisor服務項目配置

修改上面說明的supervisord.conf檔案,檔案最後兩行配置資訊的注釋取消掉,也就是去掉分号資訊:

[include]
files = supervisord.d/*.ini
-- 指定需要加載的程式項目配置檔案資訊           

建立一個測試使用的服務配置檔案:nginx.ini

[root@xiaoQ supervisord.d]# cat tomcat.ini 
[program:tomcat]
stopasgroup=true
user=root
environment=JAVA_HOME="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.352.b08-2.el7_9.x86_64",JAVA_BIN="/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.352.b08-2.el7_9.x86_64/bin"
-- 指定linux環境Java的安裝位置,如果忘記了,在指令行輸入echo $JAVA_HOME來得到
directory=/usr/local/apache-tomcat-8.5.83
-- 指定tomcat程式存放路徑資訊
command=/usr/local/apache-tomcat-8.5.83/bin/catalina.sh run
-- 指定tomcat啟動腳本路徑資訊
autostart=true
autorestart=true
startsecs=60

user=root
stderr_logfile=/usr/local/apache-tomcat-8.5.83/logs/catalina.err
stdout_logfile=/usr/local/apache-tomcat-8.5.83/logs/catalina.out           

supervisor服務重新加載

編寫完supervisor管理的程序服務配置檔案後,可以使supervisor服務加載新的服務程序,識别新編寫的服務配置檔案;

[root@xiaoQ apache-tomcat-8.5.83]# supervisorctl update 
tomcat: added process group
           

通過web界面檢視服務程序運作情況:

進階必備 | Linux系統管理工具 supervisor 詳解,代碼齊全可複制

繼續閱讀