Supervisord是用Python實(shí)現(xiàn)的一款的進(jìn)程管理工具妹卿,supervisord要求管理的程序是非守護(hù)程序挂捻,supervisord會(huì)幫你把它轉(zhuǎn)成daemon程序缩搅,因此如果用supervisord來(lái)管理進(jìn)程弓摘,進(jìn)程需要以非daemon的方式啟動(dòng)陨瘩。即進(jìn)程啟動(dòng)的時(shí)候需要是非守護(hù)進(jìn)程的方式啟動(dòng)娜膘。
例如:管理nginx的話逊脯,必須在nginx的配置文件里添加一行設(shè)置daemon off讓nginx以非守護(hù)進(jìn)程方式啟動(dòng)。
? ? ? ? 為每個(gè)流程實(shí)例編寫rc.d腳本通常很不方便竣贪。 rc.d腳本是進(jìn)程初始化/自動(dòng)啟動(dòng)/管理的最低通用分母形式军洼,但編寫和維護(hù)可能會(huì)很痛苦。此外演怎,rc.d腳本無(wú)法自動(dòng)重新啟動(dòng)崩潰的進(jìn)程匕争,并且許多程序在崩潰時(shí)無(wú)法正常重新啟動(dòng)。Supervisord將進(jìn)程作為其子進(jìn)程啟動(dòng)爷耀,并且可以配置為在崩潰時(shí)自動(dòng)重新啟動(dòng)它們甘桑。它還可以自動(dòng)配置為在自己的調(diào)用上啟動(dòng)進(jìn)程。
? ? ? ? Supervisord將進(jìn)程作為子進(jìn)程啟動(dòng)歹叮,因此它始終知道其子進(jìn)程的真正上/下狀態(tài)跑杭,并且可以方便地查詢此數(shù)據(jù)。
? ? ? ? 流程通常需要分組啟動(dòng)和停止咆耿,有時(shí)甚至是“優(yōu)先順序”德谅。通常很難向人們解釋如何做到這一點(diǎn)。Supervisor允許您為進(jìn)程分配優(yōu)先級(jí)萨螺,并允許用戶通過(guò)supervisorctl客戶端發(fā)出命令窄做,如“start all”和“restart all”,以預(yù)先分配的優(yōu)先級(jí)順序啟動(dòng)它們屑迂。此外浸策,可以將流程分組為“流程組”,并且可以停止一組邏輯相關(guān)流程并將其作為一個(gè)單元啟動(dòng)惹盼。主管為您提供一個(gè)啟動(dòng)庸汗,停止和監(jiān)控流程的位置。流程可以單獨(dú)控制手报,也可以成組控制蚯舱。您可以將Supervisor配置為提供本地或遠(yuǎn)程命令行和Web界面改化。
supervisord
服務(wù)器主管名為supervisord。它負(fù)責(zé)在自己的調(diào)用中啟動(dòng)子程序枉昏,響應(yīng)來(lái)自客戶端的命令陈肛,重新啟動(dòng)崩潰或退出的子進(jìn)程,記錄其子進(jìn)程stdout和stderr 輸出兄裂,以及生成和處理與子進(jìn)程生命周期中的點(diǎn)相對(duì)應(yīng)的“事件”句旱。
服務(wù)器進(jìn)程使用配置文件。這通常位于/etc/supervisord.conf中晰奖。此配置文件是“Windows-INI”樣式配置文件谈撒。通過(guò)適當(dāng)?shù)奈募到y(tǒng)權(quán)限保持此文件的安全非常重要,因?yàn)樗赡馨醇用艿挠脩裘兔艽a匾南。
supervisorctl
主管的命令行客戶端部分名為 supervisorctl啃匿。它為supervisord提供的功能提供了類似shell的界面。從 supervisorctl蛆楞,用戶可以連接到不同的 supervisord進(jìn)程(一次一個(gè))溯乒,獲取由子進(jìn)程控制的狀態(tài),停止和啟動(dòng)子進(jìn)程豹爹,并獲取supervisord的運(yùn)行進(jìn)程列表裆悄。
命令行客戶端通過(guò)UNIX域套接字或Internet(TCP)套接字與服務(wù)器通信。在允許客戶端執(zhí)行命令之前帅戒,服務(wù)器可以斷言客戶端的用戶應(yīng)該提供身份驗(yàn)證憑據(jù)灯帮。客戶端進(jìn)程通常使用與服務(wù)器相同的配置文件逻住,但其中包含[supervisorctl]部分的任何配置文件都可以使用钟哥。
網(wǎng)絡(luò)服務(wù)器
與功能媲美A(稀疏)的Web用戶界面 supervisorctl可以通過(guò)瀏覽器,如果你開始訪問(wèn) supervisord對(duì)互聯(lián)網(wǎng)插座瞎访。在激活配置文件的[inet_http_server]部分后腻贰,訪問(wèn)服務(wù)器URL(例如http:// localhost:9001 /)以通過(guò)Web界面查看和控制進(jìn)程狀態(tài)。
cd /usr/local/src
wget https://pypi.python.org/packages/7b/17/88adf8cb25f80e2bc0d18e094fcd7ab300632ea00b601cbbbb84c2419eae/supervisor-3.3.2.tar.gz
tar -zxvf supervisor-3.3.2.tar.gz
cd supervisor-3.3.2
python setup.py install #本地python版本為python2.7
# python2.7 setup.py install #本地python版本為python3以上
二扒秸,配置
1.生成配置文件
echo_supervisord_conf > /etc/supervisord.conf
2.啟動(dòng)
supervisord -c /etc/supervisord.conf
查看supervisord是否在運(yùn)行:
ps aux | grep supervisord
3.配置
打開配置文件
vim /etc/supervisord.conf
在配置文件底部播演,配置包括:
[include]
files=/etc/supervisor/*.conf #若你本地?zé)o/etc/supervisor目錄,請(qǐng)自建
用主管管理進(jìn)程伴奥,配置如下:
cd /etc/supervisor
vim ossfs.conf # 這里的文件名稱自定義
加入以下內(nèi)容:
; 設(shè)置進(jìn)程的名稱写烤,使用 supervisorctl 來(lái)管理進(jìn)程時(shí)需要使用該進(jìn)程名
[program:your_program_name]
command=python server.py --port=9000
;numprocs=1? ? ? ? ? ? ? ? ; 默認(rèn)為1
;process_name=%(program_name)s? ; 默認(rèn)為 %(program_name)s,即 [program:x] 中的 x
directory=/home/python/tornado_server ; 執(zhí)行 command 之前拾徙,先切換到工作目錄
user=oxygen? ? ? ? ? ? ? ? ; 使用 oxygen 用戶來(lái)啟動(dòng)該進(jìn)程
; 程序崩潰時(shí)自動(dòng)重啟洲炊,重啟次數(shù)是有限制的,默認(rèn)為3次
autorestart=true? ? ? ? ? ?
redirect_stderr=true? ? ? ? ; 重定向輸出的日志
stdout_logfile = /var/log/supervisord/tornado_server.log
loglevel=info
這里是啟動(dòng)要配置的參數(shù),請(qǐng)根據(jù)自己的項(xiàng)目自定義添加
更改了主管配置文件暂衡,需要重啟询微,運(yùn)行以下指令:
supervisorctl reload
4.supervisorctl的用法
supervisord : 啟動(dòng)supervisor
supervisorctl reload :修改完配置文件后重新啟動(dòng)supervisor
supervisorctl status :查看supervisor監(jiān)管的進(jìn)程狀態(tài)
supervisorctl start 進(jìn)程名 :?jiǎn)?dòng)XXX進(jìn)程
supervisorctl stop 進(jìn)程名 :停止XXX進(jìn)程
supervisorctl stop all:停止全部進(jìn)程,注:start狂巢、restart撑毛、stop都不會(huì)載入最新的配置文件。
supervisorctl update:根據(jù)最新的配置文件唧领,啟動(dòng)新配置或有改動(dòng)的進(jìn)程藻雌,配置沒(méi)有改動(dòng)的進(jìn)程不會(huì)受影響而重啟
5.若不使用控制臺(tái)來(lái)管理進(jìn)程,用瀏覽器來(lái)管理疹吃,該如何配置蹦疑?
打開配置文件
vim /etc/supervisord.conf
配置inet_http_server
[inet_http_server]? ? ?
port=127.0.0.1:9001? ? ; 服務(wù)器ip
username=xxx? ? ? ? ;自定義
password=xxx? ? ? ? ;自定義