進程管理工具Supervisor(一)簡介與使用


Supervisor是用Python開發的一套client/server架構的進程管理程序,能做到開機啟動,以daemon進程的方式運行程序,並可以監控進程狀態等等。

linux進程管理方式有傳統的rc.d、新興的upstart、systemd等,與這些相比,Supervisor有着自己的特點。

便利性

使用rc.d管理進程的時候,一是要寫耗時耗力的腳本,二是管理的進程掛掉的話不會自動重啟。

而supervisor要啟動子進程,只需要將子進程的啟動命令寫入配置文件即可,配置自動重啟子進程也很方便。

精確

supervisor作為父進程監控子進程,得到的子進程狀態是很准確的。

授權

一般要管理linux進程的話,特別是在一些“low" tcp端口,比如1024以下端口中運行的程序,都需要root權限。

而以root權限啟動supervisord后,一般的用戶可以在一個簡單的shell或者web界面中獲取supervisord控制的子進程運行狀態,並通過stop、start、restart的命令控制子進程的運行。

進程組

supervisor可以對子進程以start all或者restart all命令的方式進行統一管理。

中央集中式管理

supervisor可以在同一個地方啟動、停止或者監視管理的進程。既可以單獨的控制一個進程,也可以一起控制一組進程。

管理的時候,既可以本地管理,又可以遠程連接,提供命令行接口與web頁面接口。

高效性

supervisor是通過fork/exec的方式啟動子進程的,子進程掛掉的話,操作系統會立即通知supervisor。

兼容性

除了windows,其他操作系統平台都可運行supervisor。supervisor使用python編寫,不需要c編譯器。

組件

 supervisord

supervisor的服務器端,負責啟動子程序,響應客戶端發來的命令,重啟子程序,記錄子程序stdout和stderr的日志,處理Event。

配置文件一般是名為/etc/supervisord.conf的ini文件。

 supervisorctl

supervisor的命令行客戶端,提供一個類shell接口,用戶可以使用supervisorctl連接不同的supervisord進程,查看子進程狀態,start、stop子進程,獲取控制的子進程列表。

客戶端可以使用unix socket或者tcp socket與服務端進行通訊,通過配置文件中的[supervisorctl]段進行配置。

Web Server

使用tcp socket啟動supervisord的時候,提供的一個訪問supervisor的web接口。

url地址通過配置文件中的[inet_http_server]進行設置。

XML-RPC Interface

一個XML-RPC接口

下載

可以使用setuptools或者pip下載:

easy_install supervisor
or
pip install supervisor

ubuntu中使用apt下載:

apt-get install supervisor

配置文件

運行echo_supervisord_conf命令可以在shell中顯示一份supervisor配置文件樣本。配置一般是放在文件/etc/supervisord.conf的,所以可以將配置輸入到配置文件中:

echo_supervisord_conf > /etc/supervisord.conf

上述命令需要root權限,如果沒有權限或者想另置配置文件地址,可以在當前目錄生成:

echo_supervisord_conf > supervisord.conf

然后啟動時使用-c選項指定配置文件即可:

supervisord -c supervisord.conf

啟動

首先配置要啟動的子進程,可以在supervisord.conf中配置,也可以單獨配置,supervisord.conf中的include配置:

[include]
files = /etc/supervisor/conf.d/*.conf

所以可以在/etc/supervisor/conf.d/目錄下,以.conf作為擴展名為子進程建立單獨的配置文件,比如建立一個foo.conf文件:

[program:foo]
command=/bin/cat

上述是最簡單的配置了,foo為子進程名稱,command是子進程運行命令。

重啟supervisor使配置生效:

service supervisor restart

或者直接執行啟動supervisord:

$BINDIR/supervisord

啟動foo子進程:

 supervisorctl start foo

一個實際例子,啟動celery beat服務,建立celerybeat.conf文件:

; ================================
;  celery beat supervisor example
; ================================

[program:celerybeat]
; Set full path to celery program if using virtualenv
command=celery beat -A myapp --schedule /var/lib/celery/beat.db --loglevel=INFO

; remove the -A myapp argument if you aren't using an app instance

directory=/path/to/project
user=nobody
numprocs=1
stdout_logfile=/var/log/celery/beat.log
stderr_logfile=/var/log/celery/beat.log
autostart=true
autorestart=true
startsecs=10

; Causes supervisor to send the termination signal (SIGTERM) to the whole process group.
stopasgroup=true

; if rabbitmq is supervised, set its priority higher
; so it starts first
priority=999

啟動:

$ supervisorctl start celerybeat
celerybeat: started

celery beat服務開始運行了:

[2017-12-22 07:13:47,904: WARNING/ForkPoolWorker-1] 32
[2017-12-22 07:13:47,908: INFO/ForkPoolWorker-1] Task tests.tasks.add[77706e41-83c1-4545-922b-b77a57205ef5] succeeded in 0.00359446300718s: None
[2017-12-22 07:13:57,903: INFO/MainProcess] Received task: tests.tasks.add[3f9c7c88-61aa-44cc-a517-14f32305ad64]  
[2017-12-22 07:13:57,907: WARNING/ForkPoolWorker-1] 32
[2017-12-22 07:13:57,910: INFO/ForkPoolWorker-1] Task tests.tasks.add[3f9c7c88-61aa-44cc-a517-14f32305ad64] succeeded in 0.00268728499941s: None
[2017-12-22 07:14:07,903: INFO/MainProcess] Received task: tests.tasks.add[90e4277b-7041-4c3a-905c-1a5e16272d31]  
[2017-12-22 07:14:07,907: WARNING/ForkPoolWorker-1] 32
[2017-12-22 07:14:07,910: INFO/ForkPoolWorker-1] Task tests.tasks.add[90e4277b-7041-4c3a-905c-1a5e16272d31] succeeded in 0.0029478570068s: None

配置不正確的話,會報supervisor ERROR (spawn error)錯誤,可以使用tail命令看下錯誤日志:

supervisorctl tail celerybeat stdout

查看管理的子進程運行狀態:

$ supervisorctl status
celerybeat                       RUNNING   pid 66802, uptime 0:12:59

關閉子進程:

supervisorctl stop celerybeat

不加參數的直接運行supervisorctl命令,會進入supervisor客戶端的交互終端進行操作。

要通過web頁面訪問supervisor,可以添加以下配置:

[inet_http_server]
port = 127.0.0.1:9001
username = username
password = yourpwd

瀏覽器訪問127.0.0.1:9001,輸入配置的用戶名、密碼,進入頁面:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM