Supervisor
supervisor簡介
supervisor是一個管理程序的工具,python語言開發的通用的管理程式,可以管理和監控Linux上的程序,能将程序變成背景的daemon,并監控程序狀态,出現異常退出時能自動重新開機。
保持程式在背景的伺服器上保持運作狀态,是實際生産環境中常需要的需求,避免背景程序崩潰,頻繁手動重新開機程式十分費事,疏忽大意也會使程式得不到監控,supervisor是一個很好的選擇。
supervisor元件
-
supervisord
supervisor的伺服器端部分,啟動supervisor就是運作這個指令
-
supervisorctl
啟動supervisor的指令行視窗
-
Web Server
提供web接口進行通路控制
- XML-RPC interface
supervisor安裝
Linux下安裝指令
pip install supervisor
生成supervisor配置檔案
echo_supervisord_conf > supervisor.conf
系統會生成
/etc/supervisord.conf
預設檔案,在這個配置檔案裡有有英文注釋,很人性化。每個元件部分都有自己的參數設定。在
supervisor /etc/supervisord.conf
配置檔案中 使用 include在配置檔案的最後,有一個 [include] 的配置項,跟 Nginx 一樣,可以 include 某個檔案夾下的所有配置檔案,
這樣我們就可以為每個程序或相關的幾個程序的配置單獨寫成一個檔案。
對于要監控的程式配置檔案,樣闆如下
270 ;[program:theprogramname]
271 ;command=/bin/cat ; the program (relative uses PATH, can take args)
272 ;process_name=%(program_name)s ; process_name expr (default %(program_name)s)
273 ;numprocs=1 ; number of processes copies to start (def 1)
274 ;directory=/tmp ; directory to cwd to before exec (def no cwd)
275 ;umask=022 ; umask for process (default None)
276 ;priority=999 ; the relative start priority (default 999)
277 ;autostart=true ; start at supervisord start (default: true)
278 ;startsecs=1 ; # of secs prog must stay up to be running (def. 1)
279 ;startretries=3 ; max # of serial start failures when starting (default 3)
280 ;autorestart=unexpected ; when to restart if exited after running (def: unexpected)
281 ;exitcodes=0,2 ; 'expected' exit codes used with autorestart (default 0,2)
282 ;stopsignal=QUIT ; signal used to kill process (default TERM)
283 ;stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10)
284 ;stopasgroup=false ; send stop signal to the UNIX process group (default false)
285 ;killasgroup=false ; SIGKILL the UNIX process group (def false)
286 ;user=chrism ; setuid to this UNIX account to run the program
287 ;redirect_stderr=true ; redirect proc stderr to stdout (default false)
288 ;stdout_logfile=/a/path ; stdout log path, NONE for none; default AUTO
289 ;stdout_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB)
290 ;stdout_logfile_backups=10 ; # of stdout logfile backups (0 means none, default 10)
291 ;stdout_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0)
292 ;stdout_events_enabled=false ; emit events on stdout writes (default false)
293 ;stderr_logfile=/a/path ; stderr log path, NONE for none; default AUTO
294 ;stderr_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB)
295 ;stderr_logfile_backups=10 ; # of stderr logfile backups (0 means none, default 10)
296 ;stderr_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0)
297 ;stderr_events_enabled=false ; emit events on stderr writes (default false)
298 ;environment=A="1",B="2" ; process environment additions (def no adds)
299 ;serverurl=AUTO ; override serverurl computation (childutils)
300
301 ; The sample eventlistener section below shows all possible eventlistener
302 ; subsection values. Create one or more 'real' eventlistener: sections to be
303 ; able to handle event notifications sent by supervisord.
(其中分号’;'表示注釋)
這個就是supervisord.conf 檔案的内容,是不是有些太多了。
我在實際應用也隻用了其中一部分
[program:myapp] ;myapp 是supervisor監管的程式名稱
;directory=/home/ ;運作程式所在的目錄
command=python3 /home/myapp.py ;啟動所要監控的程式的指令
;autostart=true ;程式随着supervisor啟動而自動啟動
autorestart=truestartsecs = 5 ;異常後程式自動重新開機的次數
autorestart = true ;程式崩潰後是否自動重新開機
startretries = 50 ;允許重新開機失敗多少次
user = root
redirect_stderr = true
stdout_logfile_maxbytes = 30MB
stdout_logfile_backups = 5
stdout_logfile = /data/logs/supervisor/myapp_stdout.log ; 輸出日志的檔案路徑
stderr_logfile = /data/logs/supervisor/myapp_err.log
其它部分的設定可以預設。
常用指令
supervisord -c supervisord.conf 配置完supervisord.conf通過配置檔案啟動supervisor
supervisorctl -c supervisord.conf status 察看supervisor的狀态
supervisorctl -c supervisord.conf reload 重新載入 修改後的配置檔案
supervisorctl -c supervisord.conf start [all]|[appname] 啟動指定/所有 supervisor管理的程式程序
supervisorctl -c supervisord.conf stop [all]|[appname] 關閉指定/所有 supervisor管理的程式程序
通過
supervisorctl
指令進入到指令行端口,可以就可以檢視監管的程序狀态了。使用
status
、
start
、
stop
等指令操作。
附
修改supervisor中的配置檔案的,避免在/temp/supervisor.log 下存放檔案,避免被linux系統删除,應該修改存放的路徑。
參考連結:https://blog.csdn.net/woshixiaosimao/article/details/54315258