1. 程式人生 > >程序管理Supervisor的原理分析和實戰練習

程序管理Supervisor的原理分析和實戰練習

背景:

專案中遇到有些指令碼需要通過後臺程序執行,保證不被異常中斷,之前都是通過nohup、&、screen來實現,帶著能否做一個start/stop/restart/reload的服務啟動的想法找到裡Supervisor。關於supervisor的介紹在網上大致搜尋總結如下:

      Supervisor是用Python開發的一套通用的程序管理程式,能將一個普通的命令列程序變為後臺daemon,並監控程序狀態,異常退出時能自動重啟。它是通過fork/exec的方式把這些被管理的程序當作supervisor的子程序來啟動,這樣只要在supervisor的配置檔案中,把要管理的程序的可執行檔案的路徑寫進去即可。也實現當子程序掛掉的時候,父程序可以準確獲取子程序掛掉的資訊的,可以選擇是否自己啟動和報警。supervisor還提供了一個功能,可以為supervisord或者每個子程序,設定一個非root的user,這個user就可以管理它對應的程序。

說明:

1,安裝

1:easy_install 安裝:
easy_install supervisor

2:pip 安裝:
pip install supervisor

3:Debian / Ubuntu可以直接通過apt安裝:
apt-get install supervisor

1)通過apt-get install安裝後,supervisor的配置檔案在:

/etc/supervisor/supervisord.conf 

supervisor的配置檔案預設是不全的,不過在大部分預設的情況下,上面說的基本功能已經滿足。而其管理的子程序配置檔案在:

/etc/supervisor/conf.d/*.conf

然後,開始給自己需要的指令碼程式編寫一個子程序配置檔案,讓supervisor來管理它,放在/etc/supervisor/conf.d/目錄下,以.conf作為副檔名(每個程序的配置檔案都可以單獨分拆也可以把相關的指令碼放一起)。如任意定義一個和指令碼相關的專案名稱的選項組(/etc/supervisor/conf.d/test.conf):

#專案名
[program:blog]
#指令碼目錄
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
#日誌輸出 
stderr_logfile=/tmp/blog_stderr.log 
stdout_logfile=/tmp/blog_stdout.log 
#指令碼執行的使用者身份 
user = zhoujy 
#把 stderr 重定向到 stdout,預設 false
redirect_stderr = true
#stdout 日誌檔案大小,預設 50MB
stdout_logfile_maxbytes = 20M
#stdout 日誌檔案備份數
stdout_logfile_backups = 20


[program:zhoujy] #說明同上
directory=/opt/bin 
command=/usr/bin/python /opt/bin/zhoujy.py 
autostart=true 
autorestart=false 
stderr_logfile=/tmp/zhoujy_stderr.log 
stdout_logfile=/tmp/zhoujy_stdout.log 
#user = zhoujy  

2)通過easy_install安裝後,配置檔案不存在,需要自己匯入。

1:執行 echo_supervisord_conf,檢視配置樣本:
echo_supervisord_conf

2:建立配置檔案:
echo_supervisord_conf > /etc/supervisord.conf

②:配置子程序配置檔案,可以直接在supervisor中的;[program:theprogramname]裡設定。

詳細的子程序配置檔案:

樣本:

 View Code

說明:

 View Code

改成自己實際的配置檔案:和①上面一樣。

3:執行

1)apt-get install 安裝的supervisor直接可以通過 /etc/init.d/supervisor 執行:

/etc/init.d/supervisor start

2)通過easy_install 安裝的supervisor執行supervisord 執行:

supervisord 

4:web介面操作

需要在supervisor的配置檔案裡新增[inet_http_server]選項組:之後可以通過http://10.211.55.11:9001來訪問控制子執行緒的管理。

[inet_http_server]
port=10.211.55.11:9001
username=user
password=123

效果:

5:子程序管理(supervisorctl)

1) 檢視所有子程序的狀態: 

# supervisorctl status
blog                             RUNNING    pid 2395, uptime 0:08:41
zhoujy                           RUNNING    pid 2396, uptime 0:08:41

2)關閉、開啟指定的子程序:

# supervisorctl stop zhoujy
zhoujy: stopped

# supervisorctl start zhoujy
zhoujy: started

3)關閉、開啟所有的子程序:

# supervisorctl stop all
blog: stopped
zhoujy: stopped
# supervisorctl start all
blog: started
zhoujy: started

4):其他引數:supervisor開啟後子程序自動開啟(autostart=true)和子程序退出後自動啟動(autorestart=ture

總結:

      我們需要的功能在上面介紹的supervisor的基本功能中已經實現,supervisor還有其他的一些功能:如程序組、web頁面管理子程序、監控子執行緒情況等等,更多的資訊可以去官網上檢視。

參考文件:

6.3.2 安裝Supervisor

6.3.1檢查supervisord未安裝的情況下,參考本節安裝supervisord。

6.3.2.1 系統的軟體包管理器安裝方式

優先嚐試使用系統的軟體包管理器安裝。比如centos,redhat等linux系統有yum工具。 安裝python-setuptools。 執行命令:yum install python-setuptools 執行命令:easy_install supervisor 如果系統中沒有包管理器,或者包管理器無法安裝成功的場景。 請手動安裝。參考下一節描述。

6.3.2.2 手動安裝方式

前提條件:已經正確安裝python 2.6。

6.3.2.2.1安裝python-setuptools

依次執行如下命令: 下載軟體包,並copy至目標資料夾 安裝python-setuptools:tar xvf setuptools-15.1.tar.gzcd setuptools-15.1python setup.py install 檢查安裝結果:easy_install --version

6.3.2.2.2安裝meld模組

依次執行如下命令: 下載軟體包,並copy至目標資料夾 安裝meld:tar xvf meld3-0.6.8.tar.gzcd meld3-0.6.8python setup.py install

6.3.2.2.3安裝Supervisor

依次執行如下命令: 下載軟體包,並copy至目標資料夾 安裝supervisor:tar xvf supervisor-3.1.3.tar.gzcd supervisor-3.1.3python setup.py install 按照6.2.3.1的方法檢查是否安裝成功。