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上的示例效果:
记录下用法学习使用。