【Python】supervisor 工具介紹

yuntui發表於2016-11-03
一 簡介
   是一款基於Python的程式管理工具,可以很方便的管理伺服器上部署的應用程式。supervisor是C/S模型的程式,其server端是supervisord 服務,client 端是supervisorctl 命令 。
Supervisor的功能如下:
1 啟動、重啟、關閉包括但不限於python程式。
2 檢視程式的執行狀態。
3 批次維護多個程式。
思考一下當應用伺服器要部署多個服務程式,機器關閉,重啟,如何批次維護?此時supervisor是一個不錯的選擇。可以用 supervisor 同時啟動所有應用程式而不用逐個啟動。

二 如何安裝配置 
 2.1 安裝步驟請移步  本文主要介紹如何配置和常用的命令
 2.2 supervisor的配置
 supervisor啟動的時候如果沒有加上-c引數,則會使用預設的配置檔案啟動,supervisor會按照如下順序去尋找預設配置檔案:
  1. $CWD/supervisord.conf
  2. $CWD/etc/supervisord.conf
  3. /etc/supervisord.conf
$CWD表示當前的工作目錄,上面三個路徑從上到下優先順序遞減,也就是說supervosir會優先去檢查$CWD/supervisord.conf檔案是否存在,存在就使用該檔案啟動supervisor,否則向下繼續檢查。
當然我們也可以使用如下命令生成配置檔案:
  1. echo_supervisord_conf > /etc/supervisord.conf
配置檔案內如參考如下
  1. [rpcinterface:supervisor]
  2. supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
  3. [unix_http_server]
  4. file=/tmp/supervisor.sock ; supervisord 服務程式的sock檔案
  5. [supervisord]
  6. logfile=/data/logs/supervisord/supervisord.log ; 日誌檔案,預設是 $CWD/supervisord.log
  7. logfile_maxbytes=50MB ; 日誌檔案大小,超出50MB會做輪轉,預設為50MB
  8. logfile_backups=10 ; 日誌檔案保留備份數量
  9. loglevel=info ; 日誌級別,預設 info,其它: debug,warn,trace
  10. pidfile=/var/run/supervisord.pid ; pid 檔案
  11. nodaemon=false ; 是否在前臺啟動,預設是 false,即以 daemon 的方式啟動
  12. minfds=10240 ; 可以開啟的檔案描述符的最小值,預設 1024
  13. minprocs=200 ; 可以開啟的程式數的最小值,預設 200
  14. #### ###
  15. [supervisorctl]
  16. serverurl = unix:///tmp/supervisor.sock
  17. [include]
  18. files = /etc/supervisord.d/*.conf ;包含需要管理的應用程式的配置檔案
我們把檔案內容分成兩塊
1  supervisord自身的配置項內容
2  需要管理的應用程程式的配置,在[include]裡面
2.3 應用程式的cnf檔案配置資訊
應用程式的配置檔案格式 
應用程式的配置檔案格式需要[program:PROGRAM_NAME] 部分的配置,PROGRAM_NAME表示 supervisord 要管理那個程式描述,會在客戶端supervisorctl 或 web 介面顯示,可以透過 supervisorctl  start|restart|stop  PROGRAM_NAME 來操作維護該程式。
  1. [program:PROGRAM_NAME]
  2. 屬性1=引數1
  3. ....
  4.  屬性N=引數N
舉個例子: 透過supervisor 管理haunt程式
  1. [program:haunt]
  2. directory = /opt/haunt_agent ; 程式的啟動目錄
  3. command= /opt/haunt_agent/bin/haunt_agent -c /opt/haunt_agent/conf/haunt_agent.ini; 啟動haunt程式的命令,與手動啟動的命令一致
  4. autostart = true    ;在 supervisord 啟動的時候也自動啟動
  5. startsecs = 5       ;啟動 5 秒後沒有異常退出,就當作已經正常啟動了
  6. autorestart =  true ;程式異常退出後自動重啟
  7. startretries = 3    ; 啟動失敗自動重試次數,預設是 3
  8. user = app          ; 用哪個使用者啟動
  9. redirect_stderr = true ; 把 stderr 重定向到 stdout,預設 false
  10. stdout_logfile_maxbytes = 10MB ; stdout 日誌檔案大小,預設 20MB
  11. stdout_logfile_backups = 10 ; stdout 日誌檔案備份數
  12. stdout_logfile = /data/logs/supervisor/haunt_stdout.log; stdout日誌檔案,注意當指定目錄不存在時無法正常啟動,所以需要手動建立目錄(supervisord 會自動建立日誌檔案)
  13. ; 可以透過 environment 來新增需要的環境變數,一種常見的用法是修改 PYTHONPATH
  14. ; environment=PYTHONPATH=$PYTHONPATH:/path/to/somewhere
三 常用的命令
  3.1 啟動supervisor
#明確指定配置檔案
  1. supervisord -c /etc/supervisord.conf
如果以不指定配置檔案啟動,則會找預設檔案
  1. supervisord
 3.2 supervisorctl 命令介紹
supervisorctl 是supervisord的命令列客戶端工具,啟動時需要指定與supervisord使用同一份配置檔案,否則與supervisord一樣按照順序查詢配置檔案。
supervisorctl -c /etc/supervisord.conf
進入命令列模式

  1. # supervisorctl
  2. SayHello EXITED Nov 02 11:27 PM
  3. sample RUNNING pid 10082, uptime 2:56:32
  4. hawk_agent:hawk_agent-1 RUNNING pid 10084, uptime 2:56:32
  5. supervisor> status
  6. SayHello EXITED Nov 02 11:27 PM
  7. sample RUNNING pid 10082, uptime 2:56:35
  8. hawk_agent:hawk_agent-1 RUNNING pid 10084, uptime 2:56:35
  9. supervisor> reload
  10. Really restart the remote supervisord process y/N? y
  11. Restarted supervisord
  12. supervisor>
  13. supervisor> status
  14. SayHello RUNNING pid 4359, uptime 0:00:02
  15. sample RUNNING pid 4358, uptime 0:00:02
  16. yz-hawk_agent:yz-hawk_agent-1 RUNNING pid 4360, uptime 0:00:02
常用的命令介紹:
# 停止某一個程式,program_name 為 配置檔案中[program:x] 裡的 x
supervisorctl stop program_name
# 啟動某個程式
supervisorctl start program_name
# 重啟某個程式
supervisorctl restart program_name
# 結束所有屬於名為 groupworker 這個分組的程式 (start,restart 同理)
supervisorctl stop groupworker:
# 結束 groupworker:name1 這個程式 (start,restart 同理)
supervisorctl stop groupworker:name1
# 停止全部程式,注:start、restart、stop 都不會載入最新的配置檔案
supervisorctl stop all
# 載入最新的配置檔案,停止原有程式並按新的配置啟動、管理所有程式,相當於重啟所有的服務,該命令慎用
supervisorctl reload
# 根據最新的配置檔案,啟動新配置或有改動的程式,配置沒有改動的程式不會受影響而重啟
supervisorctl update

3.3 支援以 group 的方式來管理多個程式 
 supervisor 可以將多個應用程式以group的方式管理。
  1. [group:GROUP_NAME]
  2. programs=prog_name1,prog_name2 ; each refers to 'x' in [program:x] definitions
  3. priority=999 ; the relative start priority (default 999)
使用group配置之後,使用supervisorctl 管理程式的時候,變為管理group組內所有的程式
  1. supervisorctl [start|restart|stop|reload] GROUP_NAME
  2. 管理單個應用程式
  3. supervisorctl [start|restart|stop|reload] GROUP_NAME:prog_name1
  4. supervisorctl [start|restart|stop|reload] GROUP_NAME:prog_name2
如果你的應用程式比較多而且部分應用程式有關聯性,可以使用group的方式,但是如果每個應用程式相互獨立且不耦合,推薦使用
“分而治之”的思路,每個應用程式單獨一個。這樣運維應用程式的時候 更方便簡單。

四 參考文章
[1]  
[2]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30633755/viewspace-2127704/,如需轉載,請註明出處,否則將追究法律責任。

相關文章