一、簡介
由於基本每個公司都會用到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安裝
1
2
|
$ yum install python-setuptools
$ easy_install supervisor
|
或者,通過pip安裝
1
|
$ 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的默認配置的內容。其可以用來生成一份默認的配置文件:
1
|
$ echo_supervisord_conf > /etc/supervisord.conf
|
Supervisor的配置文件生成之后,現在可以添加我們要管理的進程的配置文件。可以把所有配置項都寫到supervisord.conf文件里,但並不推薦這樣做,而是通過include的方式把不同的程序(組)寫到不同的配置文件里。要確保你的supervisord.conf配置文件中include包含了你自定義的配置文件包含進來,如下:
1
2
|
[include]
files = /etc/supervisord.d/*.conf
|
下面我們修改配置文件將memcached進程以deamon方式拉起(memcached進程也可以是一個shell或python腳本),並對此進行監控。
先在supervisor目錄下創建一個配置文件,如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
$ 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還有一個更大的好處就是,可以快速開啟多個進程,配置參數如下:
1
2
|
process_name=%(process_num)s
numprocs=3
|
表示對同一個配置開啟3個線程。
啟動supervisor,就會拉起memcached進程。
1
|
$ supervisord -c /etc/supervisor/supervisord.conf
|
ps:Supervisor啟動后在/tmp目錄會產生supervisord.log 、supervisord.pid 、supervisor.sock這三個文件,如果有問題可以查看日志。
查看Supervisor是否已經啟動
1
2
|
$ ps -ef | grep supervisor | grep -v grep
root 1170 1 0 18:57 ? 00:00:00 /usr/bin/python /usr/bin/supervisord
|
查看業務進程是否已經被拉起
1
2
|
$ supervisorctl status
memcached RUNNING pid 1230, uptime 0:04:39
|
停止Supervisor(子進程也會被停止,也可以針對單個程序進行start、update、restart、stop操作)
1
|
$ supervisorctl shutdown
|
四、使用supervisorctl命令
Supervisor可通過維護命令supervisorctl管理或通過web管理界面管理。維護命令supervisorctl有兩種用法。一種是命令式,一種是交互式。
- 命令式
1. 查詢各進程運行狀態
1
|
supervisorctl status
|
2. 啟、停、重啟業務進程,memcached為進程名,即[program:memcached]里配置的值
1
2
3
|
supervisorctl start memcached
supervisorctl stop memcached
supervisorctl restart memcached
|
3. 重啟所有屬於名為groupworker這個分組的進程
1
2
3
|
supervisorctl start groupworker
supervisorctl stop groupworker
supervisorctl restart groupworker
|
4. 啟、停、重啟全部進程(不會載入最新的配置文件)
1
2
3
|
supervisorctl start all
supervisorctl stop all
supervisorctl restart all
|
5. 重新加載配置文件,停止原有進程並按新的配置啟動所有進程(注意:所有進程會停止並重啟,線上操作慎重)
1
|
supervisorctl reload
|
6. 根據最新的配置文件,啟動新配置或有改動的進程,配置沒有改動的進程不會受影響而被重啟(注意:這才是線上可以操作的命令,不會重啟原有進程)
1
|
supervisorctl update
|
注意:顯示狀態為stop停止掉的進程,用reload或者update都不會自動重啟。
- 交互式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
$ 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監控了。
1
|
/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