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 ; 預設為1process_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
原文來自微信公眾號:運維之路