Supervisor(http://supervisord.org)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制。
1.Supervisor组成部分
1)supervisord: 服务守护进程
supervisor服务器的进程名是supervisord。它主要负责在自己的调用中启动子程序,响应客户端的命令,重新启动崩溃或退出的进程,记录其子进程stdout和stderr的输出,以及生成和处理对应于子进程生命周期中的"event"服务器进程使用的配置文件,通常路径存放在/etc/supervisord.confa中。此配置文件是INI格式的配置文件。
2) supervisorctl:命令行客户端
supervisor命令行的客户端名称是supervisorctl。它为supervisord提供了一个类似于shell的交互界面。使用supervisorctl,用户可以查看不同的supervisord进程列表,获取控制子进程的状态,如停止和启动子进程
3) Web Server:提供与supervisorctl功能相当的WEB操作界面
一个可以通过Web界面来查看和控制进程的状态,默认监听在9091上。
4) XML-RPC Interface:XML-RPC接口
supervisor用于控制的XML-RPC接口
2.Supervisor安装
yum install -y epel-release
yum install -y supervisor
3.配置Supervisor
安装完Supervisor会生成如下三个程序
supervisortd:用于管理supervisor本身服务
supervisorctl:用于管理我们需要委托给superviso工具的服务
echo_supervisord_conf:用于生成superviso的配置文件
初始化配置文件
echo_supervisord_conf > /etc/supervisord.conf
修改配置文件
sed -i 's/;chmod=0700/chmod=0766/g' /etc/supervisord.conf #修改socket文件的mode,默认是0700
sed -i '$a [include] \
files = /etc/supervisord.d/*.conf' /etc/supervisord.conf #在配置文件最后添加以下两行内容来包含/etc/supervisord目录
开机启动
systemctl enable supervisord
启动/关闭/重启等操作
systemctl start/stop/restart supervisord
4.使用Supervisor
写一个脚本,配置用supervisor管理
cat /root/testvisor.py
#! /use/bin/env python
from datetime import datetime
import time
while True:
print datetime.now()
time.sleep(7)
配置Supervisor
cat <<EOF>> > /etc/supervisord.d/printdate.conf
[program:printdate] #程序唯一名称
directory=/root/ #程序路径
command=python testvisor.py #运行程序的命令
autostart=true #是否在supervisord启动后tomcat也启动
startsecs=10 #启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
numprocs=1 # 启动几个进程
autorestart=true #程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启;意思为如果不是supervisord来关闭的该进程则认为不正当关闭,supervisord会再次把该进程给启动起来,只能使用该supervisorctl来进行关闭、启动、重启操作
startretries=3 #启动失败自动重试次数,默认是3
user=root #用哪个用户启动进程,默认是root
priority=999 #进程启动优先级,默认999,假Supervisord需要管理多个进程,那么值小的优先启动
stopsignal=INT
redirect_stderr=true #把stderr重定向到stdout标准输出,默认false
stdout_logfile_maxbytes=200MB #stdout标准输出日志文件大小,日志文件大小到200M后则进行切割,切割后的日志文件会标示为catalina.out1,catalina.out2,catalina.out3...,默认50MB
stdout_logfile_backups = 100 #stdout标准输出日志文件备份数,保存100个200MB的日志文件,超过100个后老的将被删除,默认为10保存10个
stdout_logfile=/root/apache-tomcat-9.0.35/logs/catalina.out #标准日志输出位置,如果输出位置不存在则会启动失败
stopasgroup=false #默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false #默认为false,向进程组发送kill信号,包括子进程
EOF
cat printdate.conf
[program:printdate]
command=python testvisor.py
directory=/root/
autostart=true
startsecs=10
autorestart=true
startretries=3
user=root
priority=999
stopsignal=QUIT
redirect_stderr=true
stdout_logfile_maxbytes=20MB
stdout_logfile_backups = 10
stdout_logfile=/var/log/supervisor/printdate.log
stopasgroup=true
killasgroup=true
5.常用软件例子
使用supervisor管理jenkins服务进程的配置方法
[program:jenkins_tomcat]
command=/root/tomcat_jenkins/bin/catalina.sh run
process_name=%(program_name)s
numprocs=1
directory=/root/tomcat_jenkins/bin
autostart=true
startsecs=120
startretries=50
autorestart=unexpected
exitcodes=0,2
stopsignal=QUIT
stopwaitsecs=20
stopasgroup=false
killasgroup=false
user=root
redirect_stderr=false
stdout_logfile=/var/log/supervisor/jenkins_tomcat_out.log
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stdout_events_enabled=false
stderr_logfile=/var/log/supervisor/jenkins_tomcat_err.log
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB
stderr_events_enabled=false
environment=A="1",B="2"
serverurl=AUTO
supervisor 监控redis & mongodb
[root@kevin ~]# vim /etc/supervisord.conf
............
[supervisord]
nodaemon=true
[program:redis]
command=/usr/local/bin/redis-server /usr/local/etc/redis.conf
autostart=true
autorestart=true
startsecs=3
[program:mongod]
command=/usr/local/bin/mongod --dbpath /Users/weixuan/Database/mongodbdata
autostart=true
startsecs=3
autorestart=true
如果启动supervisor服务时报错如下
gave up: redis entered FATAL state, too many start retries too quickly
则解决办法为: 修改redis.conf的daemonize为no
不修改tomcat的启动脚本start.sh
[root@kevin ~]# vim /etc/supervisord.conf
............
[program:tomcat]
command=/opt/tomcat/bin/catalina.sh run
environment=JAVA_HOME="/usr/local/jdk/",JAVA_BIN="/usr/local/jdk/bin"
directory=/opt/tomcat
autostart = true
autorestart=true
redirect_stderr=true
stdout_logfile=/dev/stdout
stdout_logfile_maxbytes=10MB
startsecs=5
priority=3
stopasgroup=true
killasgroup=true
6.启动Supervisorweb界面
vim supervisord.conf
[inet_http_server]
port=0.0.0.0:9001
username=user
password=123
systemctl restart supervisord
查看界面详情
7 Supervisor管理常用命令
supervisorctl status app #app 状态
supervisorctl stop app #停止app
supervisorctl start app #启动app
supervisorctl restart app #重启app
supervisorctl reoload app #重载app
supervisorctl tail app //查看app的日志
supervisorctl start all #启动所有程序
supervisorctl stop all #停止所有程序
supervisorctl restart all #重启所有程序