有啥用?
很多我們專案排期進入聯調、測試階段,如果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會自動幫你拉起的。