程序掛了之後別再跟我說讓我幫你重啓啦! 讓supervisor幫你搞定...

有啥用?

很多我們項目排期進入聯調、測試階段,如果QA同學是直接跟你要一個後端環境的話,那簡單點大概率你就直接使用./xxx &的方式啓動程序。

但是說不定他測着測着觸發了啥預期外的東西,程序就掛了。這時你可能還沒到公司呢!QA同學就給你打電話來了,一頓客套話,辛苦xxx同學幫忙啓動一下後端的程序......

所以瞭解下supervisor這個工具還是很有必要的,它可以自動將掛了的程序重新拉起來。然後我們還能指定它的錯誤日誌輸出的位置。代碼上線前,我們不僅可以關注到QA同學提到的Case,還能去看看程序的error logwanring log中有沒有QA同學沒有發現的問題,雙份保險。

嗯......

supervisor用起來很簡單,4分鐘瞭解下即可。

安裝

 ~]# yum list | grep  supervisor

安裝之後,我們就得到的瞭如下3個二進制的命令:

echo_supervisor_conf: 將supervisor相關的所有配置打印出來。

supervisord:啓動命令。

supervisorctl:管理我們託管進supervisor中的進程。

生成配置文件

其實你安裝完supervisor之後,會自動生成一份配置文件:/etc/supervisor.conf

但是我發現在centos6中的安裝的supervisor生成的配置文件不能直接用,少了很多東西。所以纔有了本小結中的手動生成一份配置文件。

 ~]# echo_supervisord_conf > /etc/supervisord.conf

你可以參照下面的配置,去修改你的自己的配置,其實我也沒有定製什麼東西,就是保留了必要的配置參數而已。

1、配置文件中的; 是註釋符號

2、爲了讓篇幅短一點,配置文件中沒啥用的配置、註釋、或者像什麼提供一個可視化的界面這種雞肋的東西,我就直接刪掉了。有一天你自己的真正去用的時候可以挨個看看,也都不復雜。

[unix_http_server]
file=/run/supervisor.sock   ; (the path to the socket file)

[supervisord]
logfile=/var/log/supervisor/supervisord.log  ; (main log file;default $CWD/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=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=false              ; (start in foreground if true;default false)
minfds=1024                 ; (min. avail startup file descriptors;default 1024)
minprocs=200                ; (min. avail process descriptors;default 200)

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///run/supervisor.sock ; use a unix:// URL  for a unix socket

[include]
files = supervisord.d/*.ini

第一個注意點:linux中的程序啓動之後,會有個對應的socket文件。supervisord啓動之後這個socket文件位置通過[unix_http_server]中的file指定。 而且supervisorctl命令需要和supervisord在本地基於socket文件交互,所以[supervisorctl]serverurl要和[unix_http_server]中的file保持同步。

第二個注意點:其實希望大家重點關注的就是上面這個配置文件中`[include]`部分,它會加載supervisord.d/目錄下所有的x.ini文件。

在/etc目錄下創建:supervisord.d目錄存放ini文件。

*.ini文件是啥呢?

答案:比如你想將程序A託付給supervisor管理,那就按要求的格式,爲程序A創建一個A.ini配置文件,在這個文件中定義好,程序A的二進制文件在哪裏、執行啥命令啓動程序A、日誌文件在哪裏...等等。

啓動supervisor

Centos7

systemctl start supervisord;systemctl enable supervisord

Centos6

# 查看幫助文檔
~]# supervisord --help
supervisord -- run a set of applications as daemons.
Usage: /root/.jumbo/bin/supervisord [options]

Options:
-c/--configuration FILENAME -- configuration file path (searches if not given)
...

# 啓動
~]# supervisord -c /etc/supervisord.conf

自定義配置文件

*.ini文件的格式可以通過echo_supervisor_conf命令找到,它就長下面這樣:

所以參考這個配置文件,我們可以搞一個自己的ini配置,如下:

[program:bairimeng_machi]
;bairimeng_machi是自定義的項目名稱,之後supercisorctl命令管理bairimeng_machi
;command 啓動程序的相對路徑, can take args
command=/home/worker/workerspace/machi.sh 
numprocs=1                                  
;directory 在執行command之前,需要切換到哪個目錄中
directory=/home/worker/workerspace/  
;supervisord啓動時,是否同時啓動
autostart=true        
;autorestart意外退出後,是否重新啓動
autorestart=true      
startsecs=30          
startretries=3        
exitcodes=0,2        
stopsignal=QUIT      
stopwaitsecs=10       
;user 使用哪個用戶啓動本程序
user=worker             
;redirect_stderr將標準錯誤,重定向到標準輸出
redirect_stderr=true  
;stdout_logfile 標準輸出的日誌文件的位置
stdout_logfile=/home/worker/workerspace/etcd.stdout.log 
stdout_logfile_maxbytes=64MB
stdout_logfile_backups=5                             
stdout_capture_maxbytes=1MB  
stdout_events_enabled=false   

配置文件中的目錄最好提前創建出來,並把所有者、所屬組都指向配置文件中:user 部分指定的用戶。

不然很可能因爲該用戶沒有創建目錄的權限,而導致整個任務失敗。

控制命令

當有新的ini文件被託管進來時,執行如下命令啓動被託管的程序

]# supervisorctl update 

查看被託管程序的狀態:

]# supervisorctl status  bairimeng_machi
bairimeng_machi                  STARTING

]# supervisorctl status  bairimeng_machi
bairimeng_machi                  RUNNING   pid 10630, uptime 0:02:17

關閉被託管的程序

]# supervisorctl stop bairimeng_machi
bairimeng_machi: stopped

]# supervisorctl status  bairimeng_machi
bairimeng_machi                  STOPPED   Aug 29 11:38 PM

啓動程序

]# supervisorctl start bairimeng_machi
bairimeng_machi: started

]# supervisorctl status bairimeng_machi
bairimeng_machi                  RUNNING   pid 17810, uptime 0:01:06

重啓

supervisorctl restart bairimeng_machi

重新啓動配置中的所有程序

]# supervisorctl reload
Restarted supervisord

]# supervisorctl status  bairimeng_machi
bairimeng_machi                  STARTING

到這裏,你就可以放心大膽的去做別的事了,程序掛掉之後,supervisor會自動幫你拉起的。

求關注啦

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章