supervisor 是Python 開發的一套通用的進程管理程序,用於管理類Unix系統上的應用程序。
可以實現對服務的命令行、WEB、XML等方式的管理,實現對服務的啟動、重啟、關閉等操作。
服務安裝
服務的配置
常見命令行
supervisorctl 是supervisor 提供的配套命令行工作,用於對supervisor做命令行控制。
本地服務的啟動和暫停
本地服務的啟動暫停,使用的是 unix socket的方式對supervosrd 發送命令的。因此,使用本機操作命令,必須指定unix socket 的路徑。
配置如下:
<code>[supervisorctl]
serverurl=unix:///var/tmp/supervisor.sock
/<code>
命令行操作服務的啟動和暫停
<code>supervisorctl [start | stop | restart | status ] jobname
/<code>
遠程的啟動和暫停
如果開啟了遠程操作的端口,也可以通過命令行方式操作遠程服務。
<code>supervisorctl -s hostname:9001 [-u user] [ -p password] [ start | stop | restart | status ] jobname
/<code>
supervisor 配置更新和修改
- supervisor 服務配置更新, 並對修改的服務做相應操作
<code>supervisorctl update
/<code>
- supervisor 服務配置更新,並重啟所有服務。
<code>supervisorctl reload
/<code>
其他操作可以參考 supervisor官方文檔 。
Web 服務
supervisor 提供了簡約而不簡單的操作見面,可以在瀏覽器端對服務做遠程控制。
web 服務需要做如下配置,開啟服務監聽
<code>[inet_http_server]
port=*:9001
username= test
password=testpass ; 可以不需要賬號密碼
/<code>
以下為操作界面:
web 服務除了可以對服務做啟動暫停等操作外,還可以遠程查看應用的日誌,監控服務的log 是否正常。這在普通的web 服務中還是比較常用的。
二次開發
supervisor 提供了XMLRPC接口用於使用它的人可以二次開發利用。
例如,可以通過遠程訪問 supervisor 服務控制應用服務的啟動、暫停。獲取應用服務當前的服務狀態等。因此可以 通過supervisor 的xmlrpc 監控對supervisor 管理的服務做多服務遠程監控
使用xmlrpc時,需要設置inet_http_server, 用於監聽rpc和web服務的端口。(建議僅監聽內網IP,並設置相應密碼)
對於PHP服務,我做了簡單的封裝,可以從Github中獲取: github.com/lpflpf/supervisor_phpctl
<code>function monitor($host, $port, $jobname){
$server = new Supervisord($host, $port);
$state = $server->getState();
switch ($state['statename']){
case 'RUNNING': // 服務正常
break;
case 'RESTARTING': // 服務重啟
break;
case 'SHUTDOWN': // 服務關閉
break;
case 'FATAL': // 服務出現錯誤退出
//alarm();
return;
}
}
/<code>
其他需要強調的點
- supervisor 不會隨著系統的重啟而啟動,因此那些依賴supervisor的服務也不會隨著系統重啟而啟動。(別問我是怎麼知道的)解決辦法也簡單。只需要將supervisor 開機啟動就行。不同版本操作系統不太一樣。
centos 可以用如下方法:
<code>chkconfig --add supervisord
chkconfig supervisord on
/<code>
- supervisor 管理的進程可能存在多種狀態,在做服務監控時需要注意, 如下為進程狀態轉移圖:
需要注意backoff 狀態,當服務不斷進行快速關閉重啟,則會進入baockoff 狀態。這種狀態一般也是有問題的。
- 對於進程組的操作如果操作進程組中的某個進程,jobname 使用自定義的process_name。如果操作進程組中的所有進程,使用process_name:* 即可
其他類似服務
- runit
- launchd
- daemontools
- systemctl
閱讀更多 sandag 的文章