使用Supervisor管理進程

導讀Supervisor (http://supervisord.org) 是一個用Python寫Linux下的進程集中管理工具,將非daemon程序變成deamon方式運行,對於daemon程序則不能監控。可以很方便地對管理的進程進行啓動、重啓、關閉操作(不僅僅是Python進程)。除了對單個進程的控制,還可以同時啓動、關閉多個進程,比如很不幸的服務器出問題導致所有應用程序都被殺死,此時可以用supervisor同時啓動所有應用程序而不是一個一個地敲命令啓動。

除了可以方便地進行進程集中管理外,還有一個大的功能就是對程序進行監控,當程序退出時,可以自動拉起程序。其原理就是supervisor管理進程是通過fork/exec的方式把這些被管理的進程,當作supervisor的子進程來啓動,被管理進程作爲supervisor的子進程,當子進程掛掉的時候,父進程可以準確獲取子進程掛掉的信息的,所以當然也就可以對掛掉的子進程進行自動重啓了,當然重啓還是不重啓,也要看你的配置文件裏面有木有設置autostart=true了。

Supervisor管理的進程,進程組信息,全部都寫在一個ini格式的文件裏就OK了(格式可以自定義,我一般喜歡用.conf後綴)。而且,我們管理supervisor的時候的可以在本地進行管理,也可以遠程管理,而且supervisor提供了一個web界面,我們可以在web界面上監控,管理進程。 當然了,本地,遠程和web管理的時候,需要調用supervisor的xml_rpc接口。

安裝

Supervisor是基於python開發的,安裝Supervisor前,需要先安裝python,Supervisor可以通過pip或者easy_install安裝。

通過easy_install安裝

$ yum install python-setuptools
$ easy_install supervisor

或者,通過pip安裝

$ pip install supervisor

結構

Supervisord

主進程,負責管理進程的server,它會根據配置文件創建指定數量的應用程序的子進程,管理子進程的整個生命週期,對crash的進程重啓,對進程變化發送事件通知等。同時內置web server和XML-RPC Interface,輕鬆實現進程管理。

Supervisorctl

管理client,用戶通過命令行發送消息給supervisord,可以查看進程狀態,加載配置文件,啓停進程,查看進程標準輸出和錯誤輸出,遠程操作等。

Web server

Superviosr提供了web server功能,可通過web控制進程。

XML-RPC interface

XML-RPC接口,提供XML-RPC服務來對子進程進行管理,監控。

基本使用

Supervisor的配置文件命名爲supervisord.conf,它爲supervisord(Supervisor 的主服務命令) 和 supervisorctl(Supervisor 的監控管理命令) 提供配置選項設置。 Supervisor並不規定配置文件supervisord.conf的存放位置。Supervisor服務啓動的時候默認會在:

$CWD/supervisord.conf
$CWD/etc/supervisord.conf
/etc/supervisord.conf

這幾個目錄位置查找配置文件supervisord.conf,用yum安裝的supervisor默認會生成/etc/supervisord.conf配置文件。Supervisor也提供參數 “-c” 來指定配置文件的目錄路徑。

如果你是編譯安裝,或其他系統,可以在終端輸入”echo_supervisord_conf”命令查看Supervisor的默認配置的內容。其可以用來生成一份默認的配置文件:

	$ echo_supervisord_conf > /etc/supervisord.conf

Supervisor的配置文件生成之後,現在可以添加我們要管理的進程的配置文件。可以把所有配置項都寫到supervisord.conf文件裏,但並不推薦這樣做,而是通過include的方式把不同的程序(組)寫到不同的配置文件裏。要確保你的supervisord.conf配置文件中include包含了你自定義的配置文件包含進來,如下:

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

下面我們修改配置文件將memcached進程以deamon方式拉起(memcached進程也可以是一個shell或python腳本),並對此進行監控。

先在supervisor目錄下創建一個配置文件,如下

$ cat /etc/supervisord.d/memcached.conf
[program:memcached]
# 啓動程序的命令;
command = /usr/bin/memcached -m 5120 -p 11211 -u nobody -l 0.0.0.0 -b 65535
# 在supervisord啓動的時候也自動啓動;
autostart = true
# 程序異常退出後自動重啓;
autorestart = true
# 啓動5秒後沒有異常退出,就當作已經正常啓動了;
startsecs = 5
# 啓動失敗自動重試次數,默認是3;
startretries = 3
# 啓動程序的用戶;
user = nobody
# 把stderr重定向到stdout,默認false;
redirect_stderr = true
# 標準日誌輸出;
stdout_logfile=/data/log/memcached/out-memcache.log
# 錯誤日誌輸出;
stderr_logfile=/data/log/memcached/err-memcache.log
# 標準日誌文件大小,默認50MB;
stdout_logfile_maxbytes = 20MB
# 標準日誌文件備份數;
stdout_logfile_backups = 20

一份配置文件至少需要一個 [program:x] 部分的配置,來告訴supervisord 需要管理那個進程。[program:x]語法中的x表示program name,會在客戶端(supervisorctl 或 web 界面)顯示,在 supervisorctl 中通過這個值來對程序進行start、restart、stop等操作。日誌文件要存放的文件夾要創建好。

使用supervisor還有一個更大的好處就是,可以快速開啓多個進程,配置參數如下:

process_name=%(process_num)s
numprocs=3

表示對同一個配置開啓3個線程。

啓動supervisor,就會拉起memcached進程。

$ supervisord -c /etc/supervisor/supervisord.conf

ps:Supervisor啓動後在/tmp目錄會產生supervisord.log 、supervisord.pid 、supervisor.sock這三個文件,如果有問題可以查看日誌。

查看Supervisor是否已經啓動

$ ps -ef | grep supervisor | grep -v grep
root      1170     1  0 18:57 ?        00:00:00 /usr/bin/python /usr/bin/supervisord

查看業務進程是否已經被拉起

$ supervisorctl status
memcached                  RUNNING   pid 1230, uptime 0:04:39

停止Supervisor(子進程也會被停止,也可以針對單個程序進行start、update、restart、stop操作)

$ supervisorctl shutdown

使用supervisorctl命令

Supervisor可通過維護命令supervisorctl管理或通過web管理界面管理。維護命令supervisorctl有兩種用法。一種是命令式,一種是交互式。

命令式

1. 查詢各進程運行狀態

supervisorctl status

2. 啓、停、重啓業務進程,memcached爲進程名,即[program:memcached]裏配置的值

supervisorctl start memcached
supervisorctl stop memcached
supervisorctl restart memcached

3. 重啓所有屬於名爲groupworker這個分組的進程

supervisorctl start groupworker
supervisorctl stop groupworker
supervisorctl restart groupworker

4. 啓、停、重啓全部進程(不會載入最新的配置文件)

supervisorctl start all
supervisorctl stop all
supervisorctl restart all

5. 重新加載配置文件,停止原有進程並按新的配置啓動所有進程(注意:所有進程會停止並重啓,線上操作慎重)

supervisorctl reload

6. 根據最新的配置文件,啓動新配置或有改動的進程,配置沒有改動的進程不會受影響而被重啓(注意:這纔是線上可以操作的命令,不會重啓原有進程)

supervisorctl update

注意:顯示狀態爲stop停止掉的進程,用reload或者update都不會自動重啓。

交互式

$ supervisorctl
memcached                       RUNNING   pid 1256, uptime 0:01:47
supervisor> stop memcached
memcached: stopped
supervisor> start memcached
memcached: started
supervisor> status
memcached                       RUNNING   pid 1258, uptime 0:00:04
supervisor> restart memcached
memcached: stopped
memcached: started
supervisor> status
memcached                       RUNNING   pid 1259, uptime 0:00:02
supervisor>

故障處理

這幾個故障都是我使用supervisor時遇到的坑,幫你們填上。

supervisor 比較適合監控業務應用,且只能監控前臺程序,如果你的程序是以daemon的方式啓動,那麼執行:supervisor status 會提示:BACKOFF Exited too quickly (process log may have details)。比如:memcached啓動時加上-d選項就是以後臺daemon啓動,就不能使用supervisor監控了。

/usr/bin/memcached -d -m 5120 -p 11211 -u nobody -l 0.0.0.0 -b 65535

還有一個需要注意的,如果執行supervisor status時報錯是:FATAL Exited too quickly (process log may have details),要檢查一下是不是因爲添加了user = nobody導致執行權限的問題。

如果出現這個錯誤:

Error: .ini file does not include supervisord section

For help, use /usr/bin/supervisord -h

就是你的自定義的程序配置文件格式有問題(/etc/supervisor/conf.d/*.conf),好好檢查了。

其他

1)可以自己編寫腳本將Supervisor加入chkconfig中,隨系統自動啓動。 或者可以使用現成的腳本: Supervisor initscripts。

2)除了supervisorctl 之外,還可以配置supervisrod啓動web管理界面,這個web後臺使用Basic Auth的方式進行身份認證。

3)除了單個進程的控制,還可以配置group,進行分組管理。經常查看日誌文件,包括 supervisord的日誌和各個 pragram 的日誌文件,程序crash 或拋出異常的信息一半會輸出到stderr,可以查看相應的日誌文件來查找問題。

4)Supervisor有很豐富的功能,還有其他很多項配置,可以在官方文檔獲取更多信息:http://supervisord.org/index.html

本文地址:https://www.linuxprobe.com/?p=131057


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章