已复制
全屏展示
复制代码

服务管理工具 supervisor 使用总结


· 5 min read

一. 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 结尾
# 配置文件语法同上
🔗

文章推荐