Supervisor是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具。

用Supervisor管理的进程,当一个进程挂掉,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再写shell脚本来控制。

安装配置

#如果没有setuptools先安装
pip install setuptools
#或者配置epel源安装python2-pip会把python setuptools一起安装
yum install python2-pip

官网

http://www.supervisord.org/installing.html#creating-a-configuration-file

# 下载地址
https://pypi.org/simple/supervisor/

yum 安装的版本会很低,这里采用直接下载后 python setup.py install进行安装

[root@node1 modules]# wget https://files.pythonhosted.org/packages/97/48/f38bf70bd9282d1a18d591616557cc1a77a1c627d57dff66ead65c891dc8/supervisor-4.0.3.tar.gz#sha256=f768abc073e8702892718938b8a0ab98ebcb91c2afcb39bf2cb570d3eb51149e
[root@node1 modules]# tar xf supervisor-4.0.3.tar.gz 
[root@node1 modules]# cd supervisor-4.0.3/
[root@node1 modules]# python setup.py install

安装完成后执行

[root@node1 supervisor-4.0.3]# echo_supervisord_conf
[root@node1 supervisor-4.0.3]# echo_supervisord_conf > /etc/supervisord.conf

修改配置文件,增加以下配置,conf.d下的配置文件就是应用的配置文件。

# files指定的目录自己创建
cat >> /etc/supervisord.conf <<EOF
[include]
files = /opt/conf.d/*.ini
EOF

给一个程序创建配置文件

[program:test] # test程序名称,终端控制时需要的标识
command=xxx   # 运行程序的命令
user=root          # 进程执行的用户身份
directory=/        # 进程执行前会切换到这个目录
process_name=%(program_name)s_%(process_num)02d #不指定进程数时不用配置该项
numprocs = 2       # 开启的进程数量
autostart=true;		# 在supervisord 启动的时候也自动启动
autorestart=true;   # 程序意外退出是否自动重启
startsecs=10;       # 进程持续运行多久才认为是启动成功
startretries=3      # 重启失败的连续重试次数,默认为3,当超过3次后,supervisor将把此进程的状态置为FAIL
redirect_stderr=true			#把 stderr 重定向到 stdout,默认 false
stdout_logfile_maxbytes=50MB	#stdout 日志文件大小,默认 50MB
stdout_logfile_backups=20		#stdout 日志文件备份数
stdout_logfile = /var/log/xxx.log
loglevel=info

管理命令

# 启动
supervisord -c /etc/supervisord.conf

# 重启指定应用
supervisorctl restart <application name>

# 停止指定应用
supervisorctl stop <application name>

# 启动指定应用
supervisorctl start <application name>

# 重启所有应用
supervisorctl restart all

# 停止所有应用
supervisorctl stop all

# 启动所有应用
supervisorctl start all

配置文件其他参数

;[program:example]
;command=/bin/echo; the program (relative uses PATH, can take args)
;priority=999                ; the relative start priority (default 999)
;autostart=true              ; start at supervisord start (default: true)
;autorestart=true            ; retstart at unexpected quit (default: true)
;startsecs=10                ; number of secs prog must stay running (def. 10)
;startretries=3              ; max # of serial start failures (default 3)
;exitcodes=0,2               ; 'expected' exit codes for process (default 0,2)
;stopsignal=QUIT             ; signal used to kill process (default TERM)
;stopwaitsecs=10             ; max num secs to wait before SIGKILL (default 10)
;user=chrism                 ; setuid to this UNIX account to run the program
;log_stdout=true             ; if true, log program stdout (default true)
;log_stderr=true             ; if true, log program stderr (def false)
;logfile=/var/log/supervisor.log    ; child log path, use NONE for none; default AUTO
;logfile_maxbytes=1MB        ; max # logfile bytes b4 rotation (default 50MB)
;logfile_backups=10          ; # of logfile backups (default 10)

开机启动

/usr/lib/systemd/system/创建supervisord.service,写入以下内容执行systemctl enable supervisord

[Unit]
Description=Supervisor daemon

[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
ExecStop=/usr/bin/supervisorctl shutdown
ExecReload=/usr/bin/supervisorctl reload
KillMode=process
Restart=on-failure
RestartSec=42s

[Install]
WantedBy=multi-user.target