有啥用?
很多我們項目排期進入聯調、測試階段,如果QA同學是直接跟你要一個後端環境的話,那簡單點大概率你就直接使用./xxx &
的方式啓動程序。
但是說不定他測着測着觸發了啥預期外的東西,程序就掛了。這時你可能還沒到公司呢!QA同學就給你打電話來了,一頓客套話,辛苦xxx同學幫忙啓動一下後端的程序......
所以瞭解下supervisor
這個工具還是很有必要的,它可以自動將掛了的程序重新拉起來。然後我們還能指定它的錯誤日誌輸出的位置。代碼上線前,我們不僅可以關注到QA同學提到的Case,還能去看看程序的error log
、wanring 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會自動幫你拉起的。