Supervisor安装及使用
1. 简介
Supervisor( supervisord.org )是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制。
supervisor组件构成:
- supervisord(server 部分):主要负责管理子进程,响应客户端命令以及日志的输出等;
- supervisorctl(client 部分):命令行客户端,用户可以通过它与不同的 supervisord 进程联系,获取子进程的状态等。
- Web Server主要可以在界面上管理进程,Web Server其实是通过XML_RPC来实现的,可以向supervisor请求数据,也可以控制supervisor及子进程。配置在[inet_http_server]块里面;
- XML_RPC接口 : 提供了与webserver中相同的用于查询和控制进程的http接口;
2. 安装
2.1 安装软件
#centos6
1、 yum install supervisor #版本较低 2.1-9.el6
2、 pip2.7 install supervisor #version 4.0.2
#centos7
yum install supervisor #版本supervisor-3.4.0
$supervisord --version
4.0.2
复制代码
2.2 生成配置模板
生成配置文件:
echo_supervisord_conf > /etc/supervisord.conf
mkdir /etc/supervisord.conf.d/ ##存放每个进程的配置文件
复制代码
有时会出错可以如下处理:
1.生成配置出错了
$echo_supervisord_conf > /etc/supervisord.conf
Traceback (most recent call last):
File "/usr/local/python-2.7/bin/echo_supervisord_conf", line 5, in <module>
from pkg_resources import load_entry_point
File "build/bdist.linux-x86_64/egg/pkg_resources.py", line 2603, in <module>
File "build/bdist.linux-x86_64/egg/pkg_resources.py", line 666, in require
File "build/bdist.linux-x86_64/egg/pkg_resources.py", line 565, in resolve
pkg_resources.DistributionNotFound: meld3>=0.6.5
2.处理方法:
$pip install setuptools
$pip install setuptools --upgrade
3、生成配置文件
$echo_supervisord_conf > /etc/supervisord.conf
$mkdir /etc/supervisord.conf.d/ ##存放每个进程的配置文件
复制代码
2.3 管理界面
可以配置 supervisrod 启动 web 管理界面,这个 web 后台使用 Basic Auth 的方式进行身份认证。 编辑配置文件/etc/supervisord.conf,添加inet_http_server节点,如下:
vim supervisord.conf
[inet_http_server] ; inet (TCP) server disabled by default
port=192.xx.xx.xx: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))
其中,port是服务监听端口信息,username是管理员用户名,password是管理员密码。
复制代码
2.4 配置参考
最终配置参考:
cat supervisord.conf |grep -v '^;' |grep -v '^$'
[unix_http_server]
file=/tmp/supervisor.sock ; the path to the socket file
[inet_http_server] ; inet (TCP) server disabled by default
port=192.168.106.101:9001 ; ip_address:port specifier, *:port for all iface
username=admin ; default is no username (open server)
password=admin123 ; default is no password (open server)
[supervisord]
logfile=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log
logfile_maxbytes=50MB ; max main logfile bytes b4 rotation; default 50MB
logfile_backups=3 ; # of main logfile backups; 0 means none, default 10
loglevel=info ; log level; default info; others: debug,warn,trace
pidfile=/tmp/supervisord.pid ; supervisord pidfile; default supervisord.pid
nodaemon=false ; start in foreground if true; default false
minfds=1024 ; min. avail startup file descriptors; default 1024
minprocs=200 ; min. avail process descriptors;default 200
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
[include]
files = /etc/supervisord.conf.d/*.conf
复制代码
3. 启动及常用命令
3.1 启动/停止
#启动
service supervisord start
#停止
service supervisord stop
复制代码
3.2 常用命令
可以使用以下命令更新配置、更新进程、查看状态
# 读取有更新(增加)的配置文件,不会启动新添加的程序
$supervisorctl reread
# 重启配置文件修改过的程序
$supervisorctl update
# 查看程序状态
$supervisorctl status
# 启动程序 App_name
$supervisorctl start App_name
# 关闭程序 App_name
$supervisorctl stop App_name
# 重启程序 App_name
supervisorctl -c /etc/supervisord.conf restart App_name:
supervisorctl -c /etc/supervisord.conf start App_name:App_name_01
#supervisord **重载配置要用update ,不要用reload!
$supervisorctl restart App_name
以上命令也可以在supervisorctl Shell中执行:
$supervisorctl
supervisor>reread
supervisor> update
supervisor> status
supervisor> start App_name
supervisor> stop App_name
supervisor> restart App_name
复制代码
4. supervisor管理应用
4.1 修改配置文件
把应用进程的配置文件都放在/etc/supervisord.conf.d目录。 1、修改supervisord的配置文件 修改/etc/supervisord.conf的内容如下:
vim /etc/supervisord.conf
[include]
;files = relative/directory/*.ini
files = /etc/supervisord.conf.d/*.conf
复制代码
4.2 编辑应用配置文件
假定要对MySQL3307及Web服务进行管理。
- MySQL应用配置: /etc/supervisord.conf.d/mysql3307.conf
- Web应用配置: /etc/supervisord.conf.d/app.conf
1)MySQL应用配置:
$mkdir /etc/supervisord.conf.d/
$vim /etc/supervisord.conf.d/mysql3307.conf
[program:mysql3307]
directory = /data1/
command = /usr/local/mysql/bin/mysqld_safe --defaults-file=/data1/mysql3307/etc/my.cnf &
priority=1
numprocs=1
autostart=true
autorestart=true
stdout_logfile=/etc/supervisord.conf.d/mysql3307.log
startretries = 3
redirect_stderr = true
stopwaitsecs=2
复制代码
2)Web应用配置:
配置Web的supervisor管理,配置文件名为/etc/supervisord.conf.d/app.conf
[program:App_name]
directory = /data1/workspace/App_name/main ; 程序的启动目录
command = /usr/local/python-2.7/bin/python ./api_main.py --port=78%(process_num)02d ; 启动命令,可以看出与手动在命令行启动的命令是一样的
process_name=%(program_name)s_%(process_num)02d ;
numprocs=4
numprocs_start=1
autostart = true ; 在 supervisord 启动的时候也自动启动
startsecs = 5 ; 启动 5 秒后没有异常退出,就当作已经正常启动了
autorestart = true ; 程序异常退出后自动重启
startretries = 3 ; 启动失败自动重试次数,默认是 3
redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB
stdout_logfile_backups = 5 ; stdout 日志文件备份数
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile = /etc/supervisord.conf.d/App_name.log
stopwaitsecs=2
复制代码
4.3 启动supervisord
$service supervisord start
#重载配置要用update ,不要用reload,否则原应用服务会中止。
supervisorctl update (用此命令)
复制代码
说明: supervisord重载配置要用update ,不要用reload!
4.4 查看进程状态
查看进程状态,如下:
$supervisorctl status
App_name:App_name_01 RUNNING pid 11876, uptime 0:00:24
App_name:App_name_02 RUNNING pid 11878, uptime 0:00:24
App_name:App_name_03 RUNNING pid 11877, uptime 0:00:24
App_name:App_name_04 RUNNING pid 11879, uptime 0:00:24
复制代码
5. 开机自启动
1)创建/etc/init.d/supervisord文件
#创建/etc/init.d/supervisord文件
vim /etc/init.d/supervisord
#!/bin/sh
#
# /etc/rc.d/init.d/supervisord
#
# Supervisor is a client/server system that
# allows its users to monitor and control a
# number of processes on UNIX-like operating
# systems.
#
# chkconfig: - 64 36
# description: Supervisor Server
# processname: supervisord
# Source init functions
. /etc/init.d/functions
RETVAL=0
prog="supervisord"
pidfile="/tmp/supervisord.pid"
lockfile="/var/lock/subsys/supervisord"
start()
{
echo -n $"Starting $prog: "
daemon --pidfile $pidfile /usr/local/python-2.7/bin/supervisord -c /etc/supervisord.conf
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch ${lockfile}
}
stop()
{
echo -n $"Shutting down $prog: "
killproc -p ${pidfile} /usr/bin/supervisord
RETVAL=$?
echo
if [ $RETVAL -eq 0 ] ; then
rm -f ${lockfile} ${pidfile}
fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status $prog
;;
restart)
stop
start
;;
*)
echo "Usage: $0 {start|stop|restart|status}"
;;
esac
复制代码
2)设置为服务,如下的方法
chmod +x /etc/init.d/supervisord
chkconfig --add supervisord
chkconfig supervisord on
复制代码
3)执行命令
# Start the service
service supervisord start
# Stop the service
service supervisord stop
# Restart the service
service supervisord restart
复制代码