服务管理工具 supervisor 使用总结
一. supervisor 简介
- superviosr 是一个 Linux/Unix 系统上的进程管理工具,可以管理和监控 Linux 上面的进程,能将一个普通的命令行进程变为后台 daemon,并监控进程状态,异常退出时能自动重启,它不能监控 daemon 进程。
- supervisor 提供了一种统一的方式来start、stop、monitor你的进程,通过命令行或者web页面来配置 supervisor。
- supervisor 由 supervisord 和 supervisorctl 组成,supervisord是主进程,负责管理配置的子进程。supervisorctl 是一个命令行工具,用于管理那些子进程。
二. supervisor 配置说明
2.1 配置文件目录
- 配置文件为
/etc/supervisor/supervisord.conf
。 - 或者目录
/etc/supervisor/conf.d/
下以 .conf 结尾的配置文件。
2.2 安装方式说明
- CentOS 上安装
pip install supervisor
或者yum install -y supervisor
。 - Ubuntu 上安装
apt-get install supervisor
。
2.3 常用配置说明
[program:testprogram]
; testprogram 是被管理进程的一个标识。
directory=/opt/program/
; 进程运行前,会前切换到该目录。
command=/usr/bin/python /opt/program/test.py
; 要启动进程的执行命令,command只能是在终端运行的进程,不能是守护进程。
process_name=%(program_name)s_%(process_num)s
; 进程名称,如果下面的numprocs参数为1的话,则参数可不包含 process_num 字段。
numprocs=3
; 启动进程的数目。当不为1时,process_name参数必须设置,且包含 process_num。
umask=022
; 进程掩码,默认none,非必须。
priority=999
; 进程启动关闭优先级,优先级低的,最先启动,关闭的时候最后关闭,默认值为999,非必须设置。
autostart=true
; 如果是true的话,子进程将在supervisord启动后被自动启动,默认为true。
autorestart=unexpected
; false:不重启,true:重启,unexpected:子进程退出码不在exitcodes列出的退出码时自动重启。
startsecs=1
; 进程启动多少秒之后,此时状态如果是running,则认为启动成功了,默认值为1。
startretries=3
; 当进程启动失败后,最大尝试启动的次数。当超过启动次数后,此进程的状态被置为FAIL,默认值为3 。
exitcodes=0
; 和 autorestart=unexpected 对应,exitcodes定义的退出码是expected的,是正常退出,不应该被重启。
stopsignal=QUIT
; 进程停止信号,可以为TERM,HUP,INT,QUIT,KILL,USR1,USR2等信号,默认为TERM,此时退出码会被认为是expected的。
stopwaitsecs=10
; 等待停止的最大时间,超过这个时间,supervisord会向该子进程发送一个强制kill的信号,默认为10秒。
stopasgroup=false
; 设为true会停掉进程的所有子进程,默认为false。
killasgroup=false
; 和stopasgroup类似,不同的是发送kill信号,默认为false(注意:需要同时和stopasgroup=true使用)。
user=michael
; supervisord是root启动,以这个非root用户启动该进程。
redirect_stderr=true
; 如果为true,则stderr的日志会被写入stdout日志文件中,默认为false。
stdout_logfile=/opt/program/log
; 子进程的stdout的日志路径,如果标准输出的内容太少,日志可能会丢失,并且这些日志不是实时写入的。
stdout_logfile_maxbytes=100MB
; 日志文件最大大小,默认为50MB。
stdout_logfile_backups=10
; 保留日志文件备份数量。默认10。
stdout_capture_maxbytes=1MB
; 设定capture管道的大小,子进程可以从stdout发送信息给supervisor,默认为0,为0时关闭管道。
stdout_events_enabled=false
; 为ture时,子进程通过stdout写日志会触发supervisord发送PROCESS_LOG_STDOUT类型的event,默认为false。
stderr_logfile=/opt/program/err
; 设置子进程stderr写日志路径,当redirect_stderr=true 时,该配置无效。
stderr_logfile_maxbytes=100MB
; 日志文件最大大小,默认为50MB。
stderr_logfile_backups=10
; 保留日志文件备份数量。默认10。
stderr_capture_maxbytes=1MB
; 设定capture管道的大小,子进程可以从stderr发送信息给supervisor,默认为0,为0时关闭管道。
stderr_events_enabled=false
; 为ture时,子进程通过stderr写日志会触发supervisord发送PROCESS_LOG_STDERR类型的event,默认为false。
environment=A="1",B="2"
; 这个是该子进程的环境变量,和别的子进程是不共享的。
[inet_http_server]
; 提供 supervisor 管理的web界面。
port=127.0.0.1:9001
; 监听主机端口,127.0.0.1:9001 配置只能本机访问,如果要其他机器可访问可以配置 0.0.0.0:9001
username=michaelweb
; 登录username
password=123456
; 登录password
三. supervisor 完整示例
3.1 常见完整示例
[program:testprogram]
directory=/opt/program/
command=/usr/bin/python /opt/program/test.py
process_name=%(program_name)s
autostart=true
autorestart=true
startsecs=2
startretries=3
exitcodes=0
stopwaitsecs=10
stopasgroup=true
killasgroup=true
user=yuchaoshui
redirect_stderr=true
stdout_logfile=/opt/program/log
stdout_logfile_maxbytes=100MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stderr_logfile=/opt/program/err
stderr_logfile_maxbytes=100MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB
[inet_http_server]
port=0.0.0.0:9001
username=michaelweb
password=123456
3.2 常用管理操作
supervisor服务器本身管理。
- 启动
systemctl start supervisor
- 停止
systemctl stop supervisor
- 重启
systemctl restart supervisor
- 设置开机自启
systemctl enable supervisor
supervisor管理的子进程管理。
- 查看所有被管理进程状态
supervisorctl status
- 启动某个进程
supervisorctl start testprogram
- 重启某个进程
supervisorctl restart testprogram
- 停止某个进程
supervisorctl stop testprogram
- 停止所有进程
supervisorctl stop all
- 重启配置文件修改过的程序
supervisorctl update
四. supervisor 常见问题
- 当某个子进程要跑多个时,process_name 必须包含process_num,见上面的配置详解。
- 子进程如果有标准输出,如果输出的日志的量很少,不会写入到日志文件,可能会丢失掉。
五. MacOS 使用 supervisor
# 安装 supervisor
brew install supervisor
# 自动随系统启动
brew services start supervisor
# 创建配置文件目录
mkdir /usr/local/etc/supervisor.d
# 新添加的配置文件放在 /usr/local/etc/supervisor.d 目录下,以 .ini 结尾
# 配置文件语法同上