运维利器进程管理Supervisor

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

查看界面详情
运维利器进程管理Supervisor

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    #重启所有程序
  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin
avatar

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: