程序管理Supervisor的原理分析和實戰練習
背景:
專案中遇到有些指令碼需要通過後臺程序執行,保證不被異常中斷,之前都是通過nohup、&、screen來實現,帶著能否做一個start/stop/restart/reload的服務啟動的想法找到裡Supervisor。關於supervisor的介紹在網上大致搜尋總結如下:
Supervisor是用Python開發的一套通用的程序管理程式,能將一個普通的命令列程序變為後臺daemon,並監控程序狀態,異常退出時能自動重啟。它是通過fork/exec的方式把這些被管理的程序當作supervisor的子程序來啟動,這樣只要在supervisor的配置檔案中,把要管理的程序的可執行檔案的路徑寫進去即可。也實現當子程序掛掉的時候,父程序可以準確獲取子程序掛掉的資訊的,可以選擇是否自己啟動和報警。supervisor還提供了一個功能,可以為supervisord或者每個子程序,設定一個非root的user,這個user就可以管理它對應的程序。
說明:
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
改成自己實際的配置檔案:和①上面一樣。
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.gz
cd setuptools-15.1
python setup.py install
檢查安裝結果:easy_install --version
6.3.2.2.2安裝meld模組
依次執行如下命令:
下載軟體包,並copy至目標資料夾
安裝meld:tar xvf meld3-0.6.8.tar.gz
cd meld3-0.6.8
python setup.py install
6.3.2.2.3安裝Supervisor
依次執行如下命令:
下載軟體包,並copy至目標資料夾
安裝supervisor:tar xvf supervisor-3.1.3.tar.gz
cd supervisor-3.1.3
python setup.py install
按照6.2.3.1的方法檢查是否安裝成功。