Supervisor 是一个 Linux 下常用的程序控制系统。
Supervisor 基于 Python 开发,用于监听、启动、停止等控制程序。被 Supervisor 控制的程序会被 Fork 为 Supervisor 的子进程,若子进程意外死亡, Supervisor 会重启充许,不再需要手写脚本等方式进行守护程序。
安装
安装 Supervisor 可以使用包管理器方式进行安装,但是不推荐使用此方式,大部分发行版的包管理器版本都比较老旧,推荐使用 Python 包管理器进行统一管理。
easy_install
是 setuptools
工具提供的命令,因此需要先安装 setuptools 。
安装 Python
Debian/Ubuntu
# apt install python3-pip
CentOS/RHEL/Fedora
# yum install python-pip
安装 setuptools
# pip install setuptools
小贴士:不同 Python 版本命令不同,Python 3 使用 pip3 ,Python 2 使用 pip 。
安装 supervisor
# easy_install supervisor
配置
安装完成后会新增三个命令 supervisortd
、supervisorctl
、echo_supervisord_conf
。
命令 | 说明 |
---|---|
supervisortd | 守护进程服务 |
supervisorctl | 控制客户端 |
echo_supervisord_conf | 配置文件初始化程序 |
初始化配置
通过 easy_install 安装的程序无内置配置文件,因此需要初始化默认配置。
创建默认配置文件夹
# mkdir /etc/supervisor
初始化配置文件
# echo_supervisord_conf > /etc/supervisor/supervisord.conf
配置文件说明
[unix_http_server]
file=/tmp/supervisor.sock ;UNIX socket 文件,supervisorctl 会使用
;chmod=0700 ;socket文件的mode,默认是0700
;chown=nobody:nogroup ;socket文件的owner,格式:uid:gid
;[inet_http_server] ;HTTP服务器,提供web管理界面
;port=127.0.0.1:9001 ;Web管理后台运行的IP和端口,如果开放到公网,需要注意安全性
;username=user ;登录管理后台的用户名
;password=123 ;登录管理后台的密码
[supervisord]
logfile=/tmp/supervisord.log ;日志文件,默认是 $CWD/supervisord.log
logfile_maxbytes=50MB ;日志文件大小,超出会rotate,默认 50MB,如果设成0,表示不限制大小
logfile_backups=10 ;日志文件保留备份数量默认10,设为0表示不备份
loglevel=info ;日志级别,默认info,其它: debug,warn,trace
pidfile=/tmp/supervisord.pid ;pid 文件
nodaemon=false ;是否在前台启动,默认是false,即以 daemon 的方式启动
minfds=1024 ;可以打开的文件描述符的最小值,默认 1024
minprocs=200 ;可以打开的进程数的最小值,默认 200
[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ;通过UNIX socket连接supervisord,路径与unix_http_server部分的file一致
;serverurl=http://127.0.0.1:9001 ; 通过HTTP的方式连接supervisord
; [program:xx]是被管理的进程配置参数,xx是进程的名称
[program:xx]
command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run ; 程序启动命令
autostart=true ; 在supervisord启动的时候也自动启动
startsecs=10 ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒
autorestart=true ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启
startretries=3 ; 启动失败自动重试次数,默认是3
user=tomcat ; 用哪个用户启动进程,默认是root
priority=999 ; 进程启动优先级,默认999,值小的优先启动
redirect_stderr=true ; 把stderr重定向到stdout,默认false
stdout_logfile_maxbytes=20MB ; stdout 日志文件大小,默认50MB
stdout_logfile_backups = 20 ; stdout 日志文件备份数,默认是10
; stdout 日志文件,需要注意当指定目录不存在时无法正常启动,所以需要手动创建目录(supervisord 会自动创建日志文件)
stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out
stopasgroup=false ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程
killasgroup=false ;默认为false,向进程组发送kill信号,包括子进程
;包含其它配置文件
;[include]
;files = relative/directory/*.ini ;可以指定一个或多个以.ini结束的配置文件
小贴士:分号(;)开头的配置表示注释,include 示例:files = /opt/absolute/filename.ini /opt/absolute/*.ini foo.conf config??.ini 。
配置管理进程
进程管理配置参数,不建议全都写在主配置文件 supervisord.conf
中,应该每个进程写一个配置文件放在 include
参数指定的目录下。
- 1> 创建 /etc/supervisor/conf.d 目录,用于存放进程管理的配置文件。
- 2> 修改 /etc/supervisor/supervisord.conf 中的 include 参数,将 /etc/supervisor/conf.d 目录添加到 include 中。
例如:
[include]
files = /etc/supervisor/conf.d/*.ini
注意:此参数必须指定在 [include] 标签下。
以下为配置进程控制配置文件的一个例子:
[program:tomcat]
command=/opt/apache-tomcat-8.0.35/bin/catalina.sh run
stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.out
autostart=true
autorestart=true
startsecs=5
priority=1
stopasgroup=true
killasgroup=true
启动 supervisor 服务
# /usr/bin/supervisord -c /etc/supervisor/supervisord.conf
小贴士:
supervisord 进程启动成功后,可以通过 supervisorctl 客户端命令控制进程,包括启动、停止、重启等。
运行 supervisorctl
命令,不加参数,会进入 supervisor 客户端的交互终端,并会列出当前所管理的所有进程。
在交互终端中指定的程序名为配置文件中 [program:tomcat] 冒号后指定的名字,此名称不能重复。
输入 help 可以查看可以执行的命令列表,如果想看某个命令的作用,运行 help + 命令名称,如:
> help stop
非交互式终端命令
# supervisorctl status
# supervisorctl stop program_name
# supervisorctl stop all
# supervisorctl start program_name
# supervisorctl restart program_name
# supervisorctl reread
# supervisorctl update
Web 管理界面
Supervisor Web 管理界面,出于安全考虑,默认配置是没有开启 Web 管理界面,需要修改supervisord.conf 配置文件打开 HTTP 访问权限,将下面的配置:
;[inet_http_server] ; inet (TCP) server disabled by default
;port=127.0.0.1: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))
修改成:
[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))
参数 | 说明 |
---|---|
port | 绑定访问IP和端口,这里是绑定的是本地IP和9001端口 |
username | 登录管理后台的用户名 |
password | 登录管理后台的密码 |
配置自启动
SystemD 模式
创建服务单元
# cd /usr/lib/systemd/system/
# touch supervisor.service
写入配置文件
[Unit]
Description=supervisor
After=network.target
[Service]
Type=forking
ExecStart=/usr/bin/supervisord -c /etc/supervisor/supervisord.conf
ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown
ExecReload=/usr/bin/supervisorctl $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
设置开机启动
# systemctl enable supervisor.service
# systemctl daemon-reload
sysV 模式
创建配置脚本
# touch /etc/init.d/supervisor
写入配置文件
#!/bin/bash
#
# supervisord This scripts turns supervisord on
#
# Author: Mike McGrath <mmcgrath@RedHat.com> (based off yumupdatesd)
#
# chkconfig: - 95 04
#
# description: supervisor is a process control utility. It has a web based
# xmlrpc interface as well as a few other nifty features.
# processname: supervisord
# config: /etc/supervisor/supervisord.conf
# pidfile: /var/run/supervisord.pid
#
# source function library
. /etc/rc.d/init.d/functions
RETVAL=0
start() {
echo -n $"Starting supervisord: "
daemon "supervisord -c /etc/supervisor/supervisord.conf "
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/supervisord
}
stop() {
echo -n $"Stopping supervisord: "
killproc supervisord
echo
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/supervisord
}
restart() {
stop
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart|force-reload|reload)
restart
;;
condrestart)
[ -f /var/lock/subsys/supervisord ] && restart
;;
status)
status supervisord
RETVAL=$?
;;
*)
echo $"Usage: $0 {start|stop|status|restart|reload|force-reload|condrestart}"
exit 1
esac
exit $RETVAL
注意:上述脚本的文件位置及路径需要根据实际情况进行修改,仅仅为示例模板。
修改权限属性
# chmod 755 /etc/init.d/supervisor
配置自启动
# chkconfig supervisor on
其它 Linux 发行版开机启动脚本:点击跳转
supervisor 安装配置与使用:点击跳转
注意!!!supervisor只能管理非daemon的进程,也就是说supervisor不能管理守护进程。否则提示Exited too quickly (process log may have details)异常。
例子中的 Tomcat 默认是以守护进程启动的,所以改成了catalina.sh run,以前台进程的方式运行。
使用
若按照之前的配置已经启动了服务,再次使用 SystemD 或者 sysV 方式启动会报错,需要先 kill 掉相关进程,然后重新启动服务即可。
# kill -s SIGTERM $(supervisorctl pid)
参考链接
本文由 柒 创作,采用 知识共享署名4.0
国际许可协议进行许可。
转载本站文章前请注明出处,文章作者保留所有权限。
最后编辑时间: 2019-04-19 15:58 PM