1. 程式人生 > >linux應用服務管理工具(supervisor)

linux應用服務管理工具(supervisor)

注:

- 此工具屬於“工具-自動化-應急類”

– 官網:http://www.supervisord.org/

1、supervisor工具

Linux的後臺程序執行有好幾種方法,例如nohup,screen等,但是,如果是一個服務程式,要可靠地在後臺執行,我們就需要把它做成daemon,最好還能監控程序狀態,在意外結束時能自動重啟。supervisor就是用Python開發的一套通用的程序管理程式,能將一個普通的命令列程序變為後臺daemon,並監控程序狀態,異常退出時能自動重啟。

Supervisor 有兩個主要的組成部分:

– supervisord,執行 Supervisor 時會啟動一個程序 supervisord,它負責啟動所管理的程序,並將所管理的程序作為自己的子程序來啟動,而且可以在所管理的程序出現崩潰時自動重啟。

– supervisorctl,是命令列管理工具,可以用來執行 stop、start、restart 等命令,來對這些子程序進行管理。

supervisor是所有程序的父程序,管理著啟動的子進展,supervisor以子程序的PID來管理子程序,當子程序異常退出時supervisor可以收到相應的訊號量。

 1)安裝supervisor 

安裝supervisor

rpm -ivh supervisor-3.0-1.gf.el6.noarch.rpm

#實測過程中,還要安裝依賴包:

rpm -ivh python-meld3-0.6.7-1.el6.x86_64.rpm

服務命令:

service supervisord stop
service supervisord start

2)配置檔案介紹 

建立配置檔案

echo_supervisord_conf > /etc/supervisord.conf

預設下的supervisord.conf配置檔案將supervisord.pid 以及 supervisor.sock 放在 /tmp 目錄,可能會被 Linux 系統刪除的,需要作修改。

[unix_http_server]
;file=/tmp/supervisor.sock   ; (the path to the socket file)
;修改為 /var/run 目錄,避免被系統刪除
file=/var/run/supervisor.sock
;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))

;[inet_http_server]         ; inet (TCP) server disabled by default
;port=127.0.0.1:9001        ; (ip_address:port specifier, *:port for ;all iface)
;在後面遠端視覺化管理中會用到

username=calypso              ; (default is no username (open server))
password=123456               ; (default is no password (open server))

[supervisord]
;logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)
;修改為 /var/log 目錄,避免被系統刪除
logfile=/var/log/supervisor/supervisord.log
logfile_maxbytes=50MB        ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=10           ; (num of main logfile rotation backups;default 10)
loglevel=info                ; (log level;default info; others: debug,warn,trace)
;pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
;修改為 /var/run 目錄,避免被系統刪除
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)

[supervisorctl]
;修改為 /var/run 目錄,避免被系統刪除
serverurl=unix:///var/run/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 http_username if set
;password=123                ; should be same as http_password if set

[include]
files = /etc/supervisord.d/*.ini  ;對應需要管理的程序配置檔案

;[eventlistener:theeventlistenername]

;是suopervisor啟動的子程序,是訂閱supervisord傳送的event,比如報警等,後續將寫一篇傳送事件報警的實踐文章

;command=/bin/eventlistener    ;listener的可執行檔案的路徑

;process_name=%(program_name)s    ;程序名,當下面的numprocs為多個的時候,才需要。

;numprocs=1            ; 相同的listener啟動的個數

;events=EVENT           ; event事件的型別,指定型別才會被髮送

;buffer_size=10          ; 這個是event佇列快取大小

;directory=/tmp          ; 程序執行前,會切換到這個目錄下執行預設為不切換。。。非必須

;umask=022             ; 預設為none

;priority=-1            ; 啟動優先順序,預設-1

;autostart=true          ; 是否隨supervisord啟動一起啟動,預設true

;autorestart=unexpected      ; 是否自動重啟,分true,false,unexpected等

;startsecs=1            ; 也是一樣,程序啟動後跑了幾秒鐘,才被認定為成功啟動,預設1

;startretries=3          ; 失敗最大嘗試次數,預設3

;exitcodes=0,2           ; 期望或者說預料中的程序退出碼,

;stopsignal=QUIT          ; 幹掉程序的訊號,預設為TERM,比如設定為QUIT,那麼如果QUIT來幹這個程序那麼會被認為是正常維護,退出碼也被認為是expected中的

;stopwaitsecs=10          ; max num secs to wait b4 SIGKILL (default 10)

;stopasgroup=false         ; send stop signal to the UNIX process group (default false)

;killasgroup=false         ; SIGKILL the UNIX process group (def false)

;user=chrism            ;設定普通使用者,可以用來管理該listener程序。預設為空

;redirect_stderr=true        ; 為true的話,stderr的log會併入stdout的log裡面預設為false

……

;[group:thegroupname]            ;programs分組

;programs=progname1,progname2    ; 組成員,用逗號分開這個是個必須的設定項

;priority=999           ; 優先順序,相對於組和組之間說的預設999

程序配置檔案

; 設定程序的名稱,使用 supervisorctl 來管理程序時需要使用該程序名

[program:calypso_api]
command=/calypso/envs/GFSCalypsoAdapters/API/scripts/gfs_calypso_api_service.sh start
directory=/calypso/envs/GFSCalypsoAdapters/API/scripts/ ; 執行 command 之前,先切換到目錄
numprocs=1                                           ; 預設為1

process_name=%(program_name)s          ; 預設為 %(program_name)s,即 [program:x] 中的 x
user=calypso                                                       ; 使用 calypso 使用者來啟動該程序
#autostart=true
autorestart=true    ; 程式崩潰時自動重啟,重啟次數是有限制的,預設為3次,設定子程序掛掉後自動重啟的情況,有三個選項,false,unexpected和true。如果為false的時候,無論什麼情況下,都不會被重新啟動,如果為unexpected,只有當程序的退出碼不在下面的exitcodes裡面定義的
environment=PATH=”/usr/java/jdk1.7.0_21/bin:/usr/lib64/qt-3.3/bin:/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/sbin:/opt/dell/srvadmin/bin:/opt/mqm/samp/bin”              ; 設定環境變數
redirect_stderr=true
stdout_logfile=/var/log/calypso_api_stdout.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stdout_events_enabled=false
stderr_logfile=/var/log/calypso_api_stderr.log
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB
stderr_events_enabled=false

3)supervisorctl 命令介紹 

# 停止某一個程序,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

 4)注意事項 (坑)

– supervisor 比較適合監控業務應用,且只能監控前臺程式,如果你的程式是以daemon的方式啟動,那麼執行:supervisor status 會提示:BACKOFF  Exited too quickly (process log may have details)

注意設定環境變數:environment=A=”1″,B=”2″       ; process environment additions (def no adds)

2、事件外掛

1)外掛:https://github.com/ouqiang/supervisor-event-listener

supervisor-event-listener,Supervisor事件通知, 支援郵件, Slack, WebHook

2)網上有一個事件例子(附例子)http://www.cnblogs.com/felixzh/p/6100000.html

過陣子專門寫一篇這塊的整理

3、視覺化工具

預設的工具只能管理一個程序,如果在公司統一使用,需要找一個可以統一管理所有程序的工具,官網推薦了幾個視覺化工具:
-CESI

以Python編寫的基於Web的儀表板。

– Django的Dashvisor

以Python編寫的基於Web的儀表板。需要Django 1.3或1.4。

– Nodervisor

在Node.js中編寫的基於Web的儀表板

– Supervisord監視器

基於Web的儀表板用PHP編寫。

– SupervisorUI

另一個使用PHP編寫的基於Web的儀表板。

– supervisorclusterctl

使用Ansible控制多個Supervisor例項的命令列工具。

– suponoff

以Python 3編寫的基於Web的儀表板。需要Django 1.7或更高版本。

– Supvisors

專為分散式應用程式而設計,以Python 2.7編寫。包括擴充套件的XML-RPC API和基於Web的儀表板。

實測試用,其中CESI不錯,推薦使用。程式來源:https://github.com/Gamegos/cesi

視覺化工具原文來自微信公眾號:運維之路