supervisor:一個進程管理系統(tǒng)
- supervisor是一個客戶端服務端皆可用的進程管理系統(tǒng)锡凝,用戶可以用它來監(jiān)控和管理類unix操作系統(tǒng)上的一系列進程
- supervisor和launchd,daemontools,runit這些進程管理工具類似,但supervisor并不是“process id 1”的初始化代替者量九,而是作為進程和項目/用戶關(guān)系的控制系統(tǒng)
一乳愉、supervisor概述:
-
便利性:supervisor是將需要管理的服務進程作為它的子進程的方式啟動的偷遗,在進程出現(xiàn)crash的情況下可以自動重啟驶忌,而且直接通過配置就可以在supervisor服務啟動時直接啟動想要管理進程戴尸;不必要像
rc.d
腳本那樣,逐個為進程編寫各異的琅捏、復雜的初始化命令生百,而且避免了rc.d
腳本在進程crash后不自動重啟服務的問題 -
精準性:Unix下面監(jiān)控一個進程up/down的精準狀態(tài)是比較難的,
.pid
文件標記進程狀態(tài)也不是很可靠柄延;但是supervisor將進程作為子進程啟動的方式蚀浆,就保證了它可以一直知道它子進程的當前狀態(tài),而且可以方便的查詢到狀態(tài)信息 -
“監(jiān)管委托”:很多時候用戶只是需要控制進程狀態(tài)拦焚,一個進程運行過程中并不想也不需要充分的shell操作權(quán)限蜡坊,可監(jiān)聽TCP端口的一些進程往往會需要root用戶才能進行啟動或重啟;但是通常這種情況下赎败,普通用戶需要可以終止或者重啟一個進程秕衙,但是提供給普通用戶的權(quán)限往往是不夠用的,同時很多時候我們不能任意提供普通用戶root權(quán)限或者sudo權(quán)限僵刮;找各種情況下据忘,supervisor作為root用戶啟動鹦牛,那就可以允許普通用戶通過supervisor去控制進程了;supervisor被賦予了有限的操作權(quán)限后勇吊,允許用戶查看進程狀態(tài)曼追,直接通過
stop
,start
,restart
這些簡單的命令就可以控制supervisor管理下的子進程 -
進程組管理:有時候進程需要成組或者是按照一定的優(yōu)先順序進行啟動或者終止操作,這個時候很難解釋給用戶怎么樣做控制汉规,而supervisor允許用戶給進程分配優(yōu)先級礼殊,也允許用戶通過supervisorctl客戶端調(diào)用
start all
,restart all
這些命令去批量啟動或者重啟服務進程;這些進程可以被編輯分組针史,并配置好他們之間的邏輯關(guān)系作為一個進程組進行進程管理
二晶伦、supervisor的優(yōu)勢:
-
簡單:supervisor通過固定的
.ini
格式配置管理的,這個.ini
文件有固定的格式啄枕,按照約定的格式編寫配置婚陪,直接可以實現(xiàn)crash重啟、日志回旋的功能频祝,而且很容易上手 - 集中:supervisor提供了一系列進程的管理方法泌参,既可以分別管理進程也可以組管理進程;可以通過配置讓supervisor實現(xiàn)本地/遠程命令行控制常空,甚至是web界面方式進行進程管理
- 高效:supervisor通過fork/exec 啟動子進程沽一,一些管理工具那樣依賴PID文件或者定期檢測的方式重啟失敗進程,但是supervisor不一樣漓糙,因為在進程終止的時候锯玛,操作系統(tǒng)會立刻發(fā)消息給supervisor
- 擴展:supervisor有個簡單的事件通知協(xié)議,無論是哪一種開發(fā)語言開發(fā)的工程都可以用supervisor來監(jiān)控兼蜈,而且還有個XML-RPC interface來管控攘残;在python程序開發(fā)過程中supervisor可以直接作為擴展點使用
- 兼容:supervisor可以運行在除windows外的任意操作系統(tǒng)里:Linux, Mac OS X, Solaris, and FreeBSD都是支持的;加上supervisor是基于python語言實現(xiàn)的为狸,所以也不強求C語言編譯器
三歼郭、supervisor的組件:
supervisord:
- supervisord負責啟動子項目作為supervisor的子進程,響應supervisor client的命令辐棒,重啟crash掉或者已經(jīng)存在的子進程病曾,以標準輸入輸出記錄子進程的log,在子進程生命周期內(nèi)生成和把控點對點的事件通信
- 一般服務配置寫在
/etc/supervisord.conf
中漾根,文件中包含子進程管理的.ini
文件即可泰涂,需要關(guān)注的就是文件的權(quán)限管理問題,因為權(quán)限配置對于子進程的一些數(shù)據(jù)和文件的使用是有影響的
supervisorctl:
- supervisorctl相當于supervisor的命令行客戶端辐怕,把supervisord提供的功能做了封裝逼蒙,讓用戶可以通過supervisorctl連接不同的supervisord進程,獲取子進程狀態(tài)寄疏,啟動或終止子進程是牢,還可以查看當前supervisord下運行的進程有哪些
- 這個命令行客戶端負責和unix內(nèi)部或TCP socket交流僵井;在服務允許用戶執(zhí)行命令之前,一個服務可以斷言當前客戶端的用戶是否應該提供用戶身份憑據(jù)
- supervisorctl客戶端通常是和supervisord服務使用一個配置文件驳棱,但是任何一個
[supervisorctl]
下的配置文件都可以運行
Web Server:
- 如果你啟動supervisord的時候啟用了internet端口批什,一個和supervisorctl功能類似的web用戶界面就可以直接通過瀏覽器訪問;在激活
[inet_http_server]
模塊配置以后社搅,用戶可以通過類似http://localhost:9001/
這樣的地址驻债,直接查看和控制進程狀態(tài)
XML-RPC接口
- 啟動一個XML-RPC的web服務和http的web服務是一樣的,都可以用來查詢和控制supervisor和項目的運行狀態(tài)
四形葬、平臺要求:
- linux和Mac OS均可以支持却汉,但是windows不支持;
- python3.4或者python2.7版本可以更好的兼容supervisor荷并,目前為止python2.6及以上版本都支持supervisor的使用