因爲基本每一個公司都會用到supervisor這個進程管理工具,這裏簡單闡述一下。html
Supervisor (http://supervisord.org) 是一個用Python寫Linux下的進程集中管理工具,將非daemon程序變成deamon方式運行,對於daemon程序則不能監控。能夠很方便地對管理的進程進行啓動、重啓、關閉操做(不只僅是Python進程)。除了對單個進程的控制,還能夠同時啓動、關閉多個進程,好比很不幸的服務器出問題致使全部應用程序都被殺死,此時能夠用supervisor同時啓動全部應用程序而不是一個一個地敲命令啓動。python
除了能夠方便地進行進程集中管理外,還有一個大的功能就是對程序進行監控,當程序退出時,能夠自動拉起程序。其原理就是supervisor管理進程是經過fork/exec的方式把這些被管理的進程,看成supervisor的子進程來啓動,被管理進程做爲supervisor的子進程,當子進程掛掉的時候,父進程能夠準確獲取子進程掛掉的信息的,因此固然也就能夠對掛掉的子進程進行自動重啓了,固然重啓仍是不重啓,也要看你的配置文件裏面有木有設置autostart=true了。ios
Supervisor管理的進程,進程組信息,所有都寫在一個ini格式的文件裏就OK了(格式能夠自定義,我通常喜歡用.conf後綴)。並且,咱們管理supervisor的時候的能夠在本地進行管理,也能夠遠程管理,並且supervisor提供了一個web界面,咱們能夠在web界面上監控,管理進程。 固然了,本地,遠程和web管理的時候,須要調用supervisor的xml_rpc接口。web
Supervisor是基於python開發的,安裝Supervisor前,須要先安裝python,Supervisor能夠經過pip或者easy_install安裝。shell
經過easy_install安裝服務器
1
2
|
$ yum install python-setuptools
$ easy_install supervisor
|
或者,經過pip安裝ide
1
|
$ pip install supervisor
|
Supervisordmemcached
主進程,負責管理進程的server,它會根據配置文件建立指定數量的應用程序的子進程,管理子進程的整個生命週期,對crash的進程重啓,對進程變化發送事件通知等。同時內置web server和XML-RPC Interface,輕鬆實現進程管理。工具
Supervisorctlui
管理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服務啓動的時候默認會在:
這幾個目錄位置查找配置文件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
|
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