supervisor是一個Linux/Unix系統上的進程監控工具,supervisor是一個Python開發的通用的進程管理程序,能夠管理和監控Linux上面的進程,能將一個普通的命令行進程變爲後臺daemon,並監控進程狀態,異常退出時能自動重啓。不過同daemontools同樣,它不能監控daemon進程html
supervisor官網點此。node
supervisor是python編寫的,能夠用easy_install、pip均可以安裝,好比在個人centos機器下,安裝命令以下:python
yum install python-setuptools
easy_install pip
pip install superviso
在這裏我使用pip安裝以後,在建立配置文件的時候出錯,因此我又選擇了使用easy_install supervisor的安裝方法
固然也能夠下載源碼進行安裝,好比:
複製代碼
wget pypi.python.org/packages/so… --no-check-certificatlinux
tar -zxvf supervisor-3.1.3.tar.gz
cd supervisor-3.1.3
sudo python setup.py install
複製代碼
安裝以後能夠直接supervisord運行驗證是否成功,若是報錯,再逐一解決,好比可能會報meld3版本問題,這裏給出安裝步驟:git
wget http://effbot.org/media/downloads/elementtree-1.2.7-20070827-preview.zip
unzip elementtree-1.2.7-20070827-preview.zip && cd elementtree-1.2.7-20070827-preview
python setup.py install
複製代碼
或者下載此版本:github
wget http://www.plope.com/software/meld3/meld3-0.6.5.tar.gz
tar -xf meld3-0.6.5.tar.gz && cd meld3-0.6.5
python setup.py install
複製代碼
若是安裝成功就能夠進行下一步了:設置配置文件。web
### 生成配置文件,且放在/etc目錄下
echo_supervisord_conf > /etc/supervisord.conf
###爲了避免將全部新增配置信息全寫在一個配置文件裏,這裏新建一個文件夾,每一個程序設置一個配置文件,相互隔離
mkdir /etc/supervisord.d/
### 修改配置文件
vim /etc/supervisord.conf
### 加入如下配置信息
[include]
files = /etc/supervisord.d/*.conf
### 在supervisord.conf中設置經過web能夠查看管理的進程,加入如下代碼(默認即有,取消註釋便可)
[inet_http_server]
port=9001
username=user
password=123
複製代碼
啓動supervisordsql
# supervisord -c /etc/supervisord.conf
複製代碼
查看一下是否監聽shell
# lsof -i:9001
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
superviso 14685 root 4u IPv4 20155719 0t0 TCP *:etlservicemgr (LISTEN)
複製代碼
如今經過 http://ip:9001/ 就能夠查看supervisor的web界面了(默認用戶名及密碼是user和123),固然目前尚未加入任何監控的程序。apache
下面寫一個簡單的python腳本,用來驗證supervisor的監控效果。
#cat /root/temp/test_http.py ###如下便是test_http.py腳本中的代碼
#!/usr/bin/env python
# coding=utf-8
import sys
import BaseHTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler
HandlerClass = SimpleHTTPRequestHandler
ServerClass = BaseHTTPServer.HTTPServer
Protocol = "HTTP/1.0"
if __name__ == "__main__":
if sys.argv[1:]:
port = int(sys.argv[1])
else:
port = 10000
server_address = ('0.0.0.0', port)
HandlerClass.protocol_version = Protocol
httpd = ServerClass(server_address, HandlerClass)
sa = httpd.socket.getsockname()
print "Serving HTTP on", sa[0], "port", sa[1], "..."
httpd.serve_forever()
複製代碼
增長一個配置文件,以便supervisor用來監控test_http.py程序。
#cat /etc/supervisord.d/supervisor_test_http.conf ### 如下即爲配置文件中的內容
[program:test_http]
command=python /root/temp/test_http.py 9999 ; 被監控的進程路徑
directory=/root/temp ; 執行前要不要先cd到目錄去,通常不用
priority=1 ;數字越高,優先級越高
numprocs=1 ; 啓動幾個進程
autostart=true ; 隨着supervisord的啓動而啓動
autorestart=true ; 自動重啓。。固然要選上了
startretries=10 ; 啓動失敗時的最多重試次數
exitcodes=0 ; 正常退出代碼(是說退出代碼是這個時就再也不重啓了嗎?待肯定)
stopsignal=KILL ; 用來殺死進程的信號
stopwaitsecs=10 ; 發送SIGKILL前的等待時間
redirect_stderr=true ; 重定向stderr到stdout
複製代碼
從新啓動supervisord,或者從新加載配置文件:
supervisorctl reload
### 或者
supervisorctl -c /etc/supervisord.conf
複製代碼
此時再訪問http頁面,就會發現test_http.py程序已經被監控了,且已經自動啓動了。
此時也能夠訪問test_http.py程序提供的http服務了,好比http://ip:9999。
注意:supervisor只能監控前臺程序, 若是你的程序是經過fork方式實現的daemon服務,則不能用它監控,不然supervisor> status 會提示:BACKOFF Exited too quickly (process log may have details)。 所以像apache、tomcat服務默認啓動都是按daemon方式啓動的,則不能經過supervisor直接運行啓動腳本(service httpd start),相反要經過一個包裝過的啓停腳原本完成,好比tomcat在supervisor下的啓停腳本請參考:Controlling tomcat with supervisor或者supervisor-tomcat.conf。
另外,能夠將supervisor隨系統啓動而啓動,Linux 在啓動的時候會執行 /etc/rc.local 裏面的腳本,因此只要在這裏添加執行命令便可:
# 若是是 Ubuntu 添加如下內容(這裏要寫全路徑,由於此時PATH的環境變量未必設置)
/usr/local/bin/supervisord -c /etc/supervisord.conf
# 若是是 Centos 添加如下內容
/usr/bin/supervisord -c /etc/supervisord.conf
複製代碼
supervisor的管理能夠用命令行工具(supervisorctl)或者web界面管理,若是一步步按上面步驟操做,那麼web管理就能夠正常使用了,這裏單獨介紹下supervisorctl命令工具:
### 查看supervisorctl支持的命令
# supervisorctl help
default commands (type help <topic>):
=====================================
add exit open reload restart start tail
avail fg pid remove shutdown status update
clear maintail quit reread signal stop version
### 查看當前運行的進程列表
# supervisorctl status
test_http RUNNING pid 28087, uptime 0:05:17
複製代碼
其中
注意:若是原來的程序啓動時須要帶上參數,那經過supervisorctl start時應該先寫一個shell腳本,而後supervisorctl運行該腳本便可。
supervisord的配置文件主要由幾個配置段構成,配置項以K/V格式呈現。
在該配置塊的參數項表示的是一個監聽在socket上的HTTP server,若是[unixhttpserver]塊不在配置文件中或被註釋,則不會啓動基於socket的HTTP server。該塊的參數介紹以下:
- file:一個unix domain socket的文件路徑,HTTP/XML-RPC會監聽在這上面
- chmod:在啓動時修改unix domain socket的mode
- chown:修改socket文件的屬主
- username:HTTP server在認證時的用戶名
- password:認證密碼
複製代碼
在該配置塊的參數項表示的是一個監聽在TCP上的HTTP server,若是[inethttpserver]塊不在配置文件中或被註釋,則不會啓動基於TCP的HTTP server。該塊的參數介紹以下:
- port:TCP監聽的地址和端口(ip:port),這個地址會被HTTP/XML-RPC監聽
- username:HTTP server在認證時的用戶名
- password:認證密碼
複製代碼
好比:
[inet_http_server] ; inet (TCP) server disabled by default
port=0.0.0.0:9001 ; (ip_address:port specifier, *:port for all iface)
username=user ; (default is no username (open server))
password=123 ; (default is no password (open server))
複製代碼
表示監聽在9001端口,須要使用用戶名+密碼的方式訪問,訪問地址是:http//127.0.0.1:9001。
該配置塊的參數項是關於supervisord進程的全局配置項。該塊的參數介紹以下:
- logfile:log文件路徑
- logfile_maxbytes:log文件達到多少後自動進行輪轉,單位是KB、MB、GB。若是設置爲0則表示不限制日誌文件大小
- logfile_backups:輪轉日誌備份的數量,默認是10,若是設置爲0,則不備份
- loglevel:error、warn、info、debug、trace、blather、critical
- pidfile:pid文件路徑
- umask:umask值,默認022
- nodaemon:若是設置爲true,則supervisord在前臺啓動,而不是以守護進程啓動
- minfds:supervisord在成功啓動前可用的最小文件描述符數量,默認1024
- minprocs:supervisord在成功啓動前可用的最小進程描述符數量,默認200
- nocleanup:防止supervisord在啓動的時候清除已經存在的子進程日誌文件
- childlogdir:自動啓動的子進程的日誌目錄
- user:supervisord的運行用戶
- directory:supervisord以守護進程運行的時候切換到這個目錄
- strip_ansi:消除子進程日誌文件中的轉義序列
- environment:一個k/v對的list列表
複製代碼
該塊的參數一般不須要改動就可使用,固然也能夠按需修改。
該塊就是咱們要監控的程序的配置項。該配置塊的頭部是有固定格式的,一個關鍵字program,後面跟着一個冒號,接下來纔是程序名。例如:[program:foo],foo就是程序名,在使用supervisorctl來操做程序的時候,就是以foo來標明的。該塊的參數介紹以下:
- command:啓動程序使用的命令,能夠是絕對路徑或者相對路徑
- process_name:一個python字符串表達式,用來表示supervisor進程啓動的這個的名稱,默認值是%(program_name)s
- numprocs:Supervisor啓動這個程序的多個實例,若是numprocs>1,則process_name的表達式必須包含%(process_num)s,默認是1
- numprocs_start:一個int偏移值,當啓動實例的時候用來計算numprocs的值
- priority:權重,能夠控制程序啓動和關閉時的順序,權重越低:越早啓動,越晚關閉。默認值是999
- autostart:若是設置爲true,當supervisord啓動的時候,進程會自動重啓。
- autorestart:值能夠是false、true、unexpected。false:進程不會自動重啓,unexpected:當程序退出時的退出碼不是exitcodes中定義的時,進程會重啓,true:進程會無條件重啓當退出的時候。
- startsecs:程序啓動後等待多長時間後才認爲程序啓動成功
- startretries:supervisord嘗試啓動一個程序時嘗試的次數。默認是3
- exitcodes:一個預期的退出返回碼,默認是0,2。
- stopsignal:當收到stop請求的時候,發送信號給程序,默認是TERM信號,也能夠是 HUP, INT, QUIT, KILL, USR1, or USR2。
- stopwaitsecs:在操做系統給supervisord發送SIGCHILD信號時等待的時間
- stopasgroup:若是設置爲true,則會使supervisor發送中止信號到整個進程組
- killasgroup:若是設置爲true,則在給程序發送SIGKILL信號的時候,會發送到整個進程組,它的子進程也會受到影響。
- user:若是supervisord以root運行,則會使用這個設置用戶啓動子程序
- redirect_stderr:若是設置爲true,進程則會把標準錯誤輸出到supervisord後臺的標準輸出文件描述符。
- stdout_logfile:把進程的標準輸出寫入文件中,若是stdout_logfile沒有設置或者設置爲AUTO,則supervisor會自動選擇一個文件位置。
- stdout_logfile_maxbytes:標準輸出log文件達到多少後自動進行輪轉,單位是KB、MB、GB。若是設置爲0則表示不限制日誌文件大小
- stdout_logfile_backups:標準輸出日誌輪轉備份的數量,默認是10,若是設置爲0,則不備份
- stdout_capture_maxbytes:當進程處於stderr capture mode模式的時候,寫入FIFO隊列的最大bytes值,單位能夠是KB、MB、GB
- stdout_events_enabled:若是設置爲true,當進程在寫它的stderr到文件描述符的時候,PROCESS_LOG_STDERR事件會被觸發
- stderr_logfile:把進程的錯誤日誌輸出一個文件中,除非redirect_stderr參數被設置爲true
- stderr_logfile_maxbytes:錯誤log文件達到多少後自動進行輪轉,單位是KB、MB、GB。若是設置爲0則表示不限制日誌文件大小
- stderr_logfile_backups:錯誤日誌輪轉備份的數量,默認是10,若是設置爲0,則不備份
- stderr_capture_maxbytes:當進程處於stderr capture mode模式的時候,寫入FIFO隊列的最大bytes值,單位能夠是KB、MB、GB
- stderr_events_enabled:若是設置爲true,當進程在寫它的stderr到文件描述符的時候,PROCESS_LOG_STDERR事件會被觸發
- environment:一個k/v對的list列表
- directory:supervisord在生成子進程的時候會切換到該目錄
- umask:設置進程的umask
- serverurl:是否容許子進程和內部的HTTP服務通信,若是設置爲AUTO,supervisor會自動的構造一個url
複製代碼
好比下面這個選項塊就表示監控一個名叫test_http的程序:
[program:test_http]
command=python test_http.py 10000 ; 被監控的進程啓動命令
directory=/root/ ; 執行前要不要先cd到目錄去,通常不用
priority=1 ;數字越高,優先級越高
numprocs=1 ; 啓動幾個進程
autostart=true ; 隨着supervisord的啓動而啓動
autorestart=true ; 自動重啓。。固然要選上了
startretries=10 ; 啓動失敗時的最多重試次數
exitcodes=0 ; 正常退出代碼(是說退出代碼是這個時就再也不重啓了嗎?待肯定)
stopsignal=KILL ; 用來殺死進程的信號
stopwaitsecs=10 ; 發送SIGKILL前的等待時間
redirect_stderr=true ; 重定向stderr到stdout
複製代碼
supervisor不支持跨機器的進程監控,一個supervisord只能監控本機上的程序,大大限制了supervisor的使用。
不過因爲supervisor自己支持xml-rpc,所以也有一些基於supervisor二次開發的多機器進程管理工具。好比:
以上那麼多,我都不會,一個個試起來也很麻煩,搞不定,除了最後一個cesi,還好懂點pyhon,勉強安裝成功了。
cesi具體安裝說明請直接參考原Readme。這裏只作一點說明:
git clone https://github.com/Gamegos/cesi
cd cesi && mkdir pack
python setup.py build
python setup.py install
sqlite3 /本身的路徑path/userinfo.db < userinfo.sql
cp cesi.conf /etc/cesi.conf ### 自行修改cesi.conf內容,kv對,很簡單
cd cesi && python web.py ### 便可啓動成功
複製代碼
cesi.conf配置文件的設置:
[node:local] ### 設置監控的各個機器
username = user
password = 123
host = 192.168.14.8
port = 9001
;[node:<node_name2>] ### 若是有多臺機器,就依次添加
;username = <username>
;password = <password>
;host = <hostname>
;port = <port>
;[environment:<environment_name>]
;members = <node_name>, <node_name2>
[cesi]
database = /root/temp/cesi/userinfo.db ### 設置db路徑
activity_log = /root/temp/cesi/cesi.log ### 設置log路徑
host = 0.0.0.0
複製代碼
一切順利的話,可經過頁面http://ip:5000,用戶名,密碼都是admin,最終的效果以下所示:
cesi repo上的示例效果:
記錄下用法學習使用。