Supervisor 的學習和使用

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>

以下為操作界面:

Supervisor 的學習和使用

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 管理的進程可能存在多種狀態,在做服務監控時需要注意, 如下為進程狀態轉移圖:
Supervisor 的學習和使用

需要注意backoff 狀態,當服務不斷進行快速關閉重啟,則會進入baockoff 狀態。這種狀態一般也是有問題的。

  • 對於進程組的操作如果操作進程組中的某個進程,jobname 使用自定義的process_name。如果操作進程組中的所有進程,使用process_name:* 即可

其他類似服務

  • runit
  • launchd
  • daemontools
  • systemctl


分享到:


相關文章: