介绍

Supervisor是一个进程管理工具,用于在类UNIX操作系统上控制和监视多个进程。能够自动启动、停止、重启和管理进程,并提供对进程日志的访问和监控。
中文官网
本次以测试CentOS 7进行

Supervisor

安装 supervisor

#安装
yum install -y epel-release
# CentOS/Rocky
sudo yum install -y supervisor
# Ubuntu/Debian
sudo apt install -y supervisor

# 立即启动(其中一个)
sudo systemctl start supervisor      # 或 service supervisord start
sudo systemctl start supervisord

# 开机自启(其中一个)
sudo systemctl enable supervisor     # 或 chkconfig supervisord on
sudo systemctl enable supervisord

#查看状态(其中一个)
sudo systemctl status supervisor
sudo systemctl status supervisord
# 看到 active (running) 即为成功

sudo supervisorctl reload

# 查看命令所在位置
which supervisorctl
# 清理缓存
hash -r
# 修改配置后重载
sudo supervisorctl update
路径作用
/usr/bin/supervisord守护进程主程序
/etc/supervisor/supervisord.conf(或者/etc/supervisord.conf)主配置文件(初始化配置就在这儿)
/etc/supervisor/conf.d/*.conf(或者/etc/supervisord.d)业务进程配置目录
# Unix socket 配置,用于 CLI 工具连接
[unix_http_server]
file=/var/run/supervisor.sock   # Unix socket 文件路径
chmod=0700                      # 设置 socket 文件的权限

# 如果想开启 Web UI
[inet_http_server]
port = 0.0.0.0:9001             # Web UI 的监听端口
username = admin                # Web UI 的用户名
password = 123456               # Web UI 的密码

[supervisord]
logfile=/var/log/supervisor/supervisord.log  # Supervisor 日志文件路径
pidfile=/var/run/supervisord.pid             # Supervisor 的 PID 文件路径
childlogdir=/var/log/supervisor              # 子进程日志文件目录

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

# CLI 默认连接的 socket
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock    # Supervisorctl 连接的 socket 文件路径

# 业务配置所在目录
[include]
files = /etc/supervisor/conf.d/*.conf        # 包含业务配置文件的目录路径

Supervisor 常用命令表(进程查看 启动 日志)

 

功能命令示例说明
查看所有进程列表supervisorctl statussupervisorctl status列出所有 Supervisor 管理的进程及其状态。
查看单个进程状态supervisorctl status <program>supervisorctl status myapp查看指定进程的运行状态。
启动指定进程supervisorctl start <program>supervisorctl start myapp启动某个程序。
停止指定进程supervisorctl stop <program>supervisorctl stop myapp停止某个程序。
重启指定进程supervisorctl restart <program>supervisorctl restart myapp重启某个程序。
查看实时日志(stdout)supervisorctl tail -f <program>supervisorctl tail -f myapp查看程序输出日志,实时刷新。
查看实时错误日志(stderr)supervisorctl tail -f <program> stderrsupervisorctl tail -f myapp stderr实时查看程序错误日志。
查看日志末尾(默认1600行)supervisorctl tail <program>supervisorctl tail myapp查看日志末尾部分,不跟随刷新。
重新读取配置supervisorctl rereadsupervisorctl reread检查配置文件是否有新增或修改。
应用更新的配置supervisorctl updatesupervisorctl update启动新增的进程、重启变更的进程。

 


业务服务配置

sudo vim /etc/supervisor/conf.d/myapp.conf
# /etc/supervisor/conf.d/myapp.conf
# Java 业务进程最小可运行模板,按需调整

[program:myapp]
# ==== 1. 启动命令 ==== -Dlogging.file.name=""  是控制原本的打印日志消失
command=java -Dlogging.file.name="" -jar myapp.jar

# ==== 2. 运行环境 ====
# 进程的工作目录(相当于先 cd /opt/apps 再执行 java -jar …
directory=/opt/apps
# 指定 Linux 用户身份来跑 Java 进程
user=root
# 额外环境变量注入给 JVM
environment=JAVA_HOME="/wzxy/jdk/jdk1.8",PATH="/wzxy/jdk/jdk1.8/bin:%(ENV_PATH)s",SPRING_PROFILES_ACTIVE="prod"

# ==== 3. 重启策略 ====
# supervisord 自己启动时,要不要顺便把这个进程也拉起来
autostart=true
# 进程异常退出(非 0)时是否自动重启
autorestart=true
# 启动后 持续 30 秒内不退出,Supervisor 才认为“启动成功”
startsecs=30
# 启动失败最多重试几次
startretries=3

# ==== 4. 日志配置 ====
# 把 标准错误(stderr) 也合并到 标准输出(stdout),一起写进日志文件
redirect_stderr=true
# 指定 stdout 日志文件的完整路径
stdout_logfile=/var/log/supervisor/myapp.log
# 单个日志文件达到 50 MB 就自动轮转
stdout_logfile_maxbytes=50MB
# 日志轮转时,保留最近 10 份历史文件
stdout_logfile_backups=10

# ==== 5. 资源限制(可选) ====  使用默认配置即可
#   启动/停止优先级,数字越小越先启动、越后停止
# priority=999
# 一次拉起多少个相同进程
# numprocs=1
# 实例命名模板
# process_name=%(program_name)s

使用脚本方式

# /etc/supervisor/conf.d/myapp.conf
# Java 业务进程最小可运行模板,按需调整

[program:myapp]
# ==== 1. 启动命令 ====
command=/bin/bash /opt/apps/restart_java.sh

# ==== 2. 运行环境 ====
# 进程的工作目录
directory=/opt/apps
# 指定 Linux 用户身份来跑 Java 进程
user=root
# 额外环境变量注入给 JVM
environment=JAVA_HOME="/wzxy/jdk/jdk1.8",PATH="/wzxy/jdk/jdk1.8/bin:%(ENV_PATH)s",SPRING_PROFILES_ACTIVE="prod"

# ==== 3. 重启策略 ====
# supervisord 自己启动时,要不要顺便把这个进程也拉起来
autostart=true
# 进程异常退出(非 0)时是否自动重启
autorestart=true
# 启动后 持续 30 秒内不退出,Supervisor 才认为“启动成功”
startsecs=30
# 启动失败最多重试几次
startretries=3

# ==== 4. 日志配置 ====
# 把 标准错误(stderr) 也合并到 标准输出(stdout),一起写进日志文件
redirect_stderr=true
# 指定 stdout 日志文件的完整路径
stdout_logfile=/var/log/supervisor/myapp.log
# 单个日志文件达到 50 MB 就自动轮转
stdout_logfile_maxbytes=50MB
# 日志轮转时,保留最近 10 份历史文件
stdout_logfile_backups=10

# ==== 5. 资源限制(可选) ====  使用默认配置即可
#   启动/停止优先级,数字越小越先启动、越后停止
# priority=999
# 一次拉起多少个相同进程
# numprocs=1
# 实例命名模板
# process_name=%(program_name)s

restart_java.sh

#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
shopt -s nullglob &nbsp; &nbsp; &nbsp; &nbsp;  # 避免无匹配时报错

APP_BASE_NAME="admin"
WORK_DIR="/wzxy/jwAdmin"

# 检查是否存在相同名称的 Java 包进程 以免端口占用的情况 视情况使用
# if pgrep -f "${APP_BASE_NAME}-.*\.jar" > /dev/null; then
# &nbsp; &nbsp; echo "找到正在运行的相同名称的 Java 包进程,正在关闭..." >&2
# &nbsp; &nbsp; pkill -f "${APP_BASE_NAME}-.*\.jar"
# &nbsp; &nbsp; echo "已关闭相同名称的 Java 包进程" >&2
# fi

cd "$WORK_DIR"

# 列出所有匹配 jar
jars=(${APP_BASE_NAME}-*.jar)
[[ ${#jars[@]} -eq 0 ]] && { echo "❌ 目录 $WORK_DIR 下未找到任何 ${APP_BASE_NAME}-*.jar" >&2; exit 1; }

latest=$(printf '%s\n' "${jars[@]}" | sort -V | tail -n1)
echo "启动应用: $latest" >&2 &nbsp; # 仅提示,不进业务日志

exec java \
  -Dlogging.file.name="" \
  -Dlogging.pattern.console="%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level [%thread] %logger{50} - %msg%n" \
  -jar "$latest"

启动并设为开机自启

sudo systemctl enable --now supervisord

此时单机就能用 http://这台服务器IP:9001 访问 Supervisor Web

卸载

# CentOS / RHEL
sudo yum remove -y supervisor
# Ubuntu / Debian
sudo apt remove -y supervisor

完整配置解释

#vim /etc/supervisord.conf

[unix_http_server] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; supervisord的unix socket服务配置
file=/var/tmp/supervisor.sock  ; socket文件的保存目录
chmod=0777 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; socket的文件权限 (default 0700)
chown=root:root &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  ; socket的拥有者和组名
;username=user &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 使用supervisorctl连接的时候认证的用户,非必须
;password=123 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  ; 可以直接使用明码,也可以使用SHA加密,如:{SHA}82ab876d1387bfafe46cc1c8a2ef074eae50cb1d
[inet_http_server] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; supervisord的tcp服务配置 Web管理界面设定
port=*:9001 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  ; tcp端口,ip_address:port specifier, *:port for all iface
username=user &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  ; tcp登陆用户
password=123 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; tcp登陆密码

[supervisord] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  ; supervisord的主进程配置
logfile=/data/log/supervisor/main.log ; 主进程日志
logfile_maxbytes=50MB &nbsp; &nbsp; &nbsp; &nbsp;  ; 最大日志体积,默认50MB,当超过50M的时候,会生成一个新的日志文件。当设置为0时,表示不限制文件大小
logfile_backups=10 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 日志文件备份数目,默认10。当设置为0时,表示不限制文件的数量
loglevel=info &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  ; 日志级别,默认info; 还有:critical, error, warn, debug, trace, blather
pidfile=/var/run/supervisord.pid ; supervisord的pidfile文件
nodaemon=false &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; false: 以守护进程的方式启动 superviser
minfds=1024 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  ; 最少系统空闲的文件描述符,低于这个值supervisor将不会启动
minprocs=200 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 最最小可用的进程描述符,低于这个值supervisor也将不会正常启动
;umask=022 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 进程文件的umask,默认200
user=root &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  ; 默认为当前用户,如果为root则必填。这个参数可以设置一个非root用户,
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 当我们以root用户启动supervisor之后,这里设置的这个用户,也可以对supervisor进行管理
;identifier=supervisor &nbsp; &nbsp; &nbsp; &nbsp; ; supervisord的表示符, 默认是'supervisor'。主要是给XML_RPC用的。
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 当有多个supervisor的时候,而且想调用XML_RPC统一管理,就需要为每个supervisor设置不同的标识符了
;directory=/tmp &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  ; 当supervisor作为守护进程运行的时候,设置这个参数的话,启动主进程之前,会先切换到这个目录
nocleanup=true &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 当为false的时候,会在supervisord进程启动的时候,把以前子进程
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 产生的日志文件(路径为AUTO的情况下)清除掉。有时候咱们想要看历史日志,当
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 然不想日志被清除了。所以可以设置为true
childlogdir=/data/log/supervisor  ; 当子进程日志路径为AUTO的时候,子进程日志文件的存放路径。
;environment=A="1",B="2" &nbsp; &nbsp; &nbsp; ; 可在这里可以设置supervisord进程特有的其他环境变量
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; supervisord启动子进程时,子进程会拷贝父进程的内存空间内容。 所以设置的这些环境变量也会被子进程继承。
;strip_ansi=false &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  ; 如果设置为true,会清除子进程日志中的所有 ANSI 序列

[supervisorctl] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  ; 针对supervisorctl的一些配置
serverurl=unix:///tmp/supervisor.sock &nbsp; ; 注意这个是和前面的[unix_http_server]对应的
serverurl=http://127.0.0.1:9001 &nbsp; &nbsp; &nbsp; &nbsp; ; 注意这个和前面的[inet_http_server]对应
username=user &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  ; 如果设置应该与http_username相同
password=123 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 如果设置应该与http_password相同
;prompt=mysupervisor &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 命令行提示符,默认"mysupervisor"
;history_file=~/.sc_history &nbsp;  ; 命令行历史纪录,和shell中的history类似

; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor] &nbsp; &nbsp;  ; 这个选项是给XML_RPC用的
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface


;[program:example] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 管理的单个进程的配置,可以添加多个program
command=/bin/sh ~/example.sh &nbsp; ; 被监控程序指定的运行脚本
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 如果command的栏运行的是shell脚本,那么在shell脚本启动被监控程序时要用exec修饰
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 例如: echo $RUN_CMD
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; &nbsp; &nbsp; &nbsp; eval exec $RUN_CMD
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 否则,supervisord停止不了启动的进程.此外,shell脚本里不能出现&之类的后台运行符号
;process_name=%(program_name)s ; 进程名表达式,默认为%(program_name)s,如果下面的numprocs参数为1的话,就不用管这个参数
;numprocs=1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  ; 默认启动的进程数目,默认为1
;directory=/opt &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  ; 进程运行前,会前切换到这个目录
;umask=022 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 进程umask,默认None
priority=999 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 程序运行的优先级,默认999
autostart=true &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 默认随supervisord自动启动,默认true
autorestart=true &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 被监控程序异常中断是否自动重启,有三个选项,false,unexpected和true
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ;false时,无论什么情况下,都不会被重新启动,
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 为unexpected时,只有当进程的退出码不在下面的exitcodes里面定义的退出码的时候,才会被自动重启。
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ;true时,只要子进程挂掉,将会被无条件的重启
startsecs=5 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  ; 进程持续运行多久才认为是启动成功
startretries=3 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 被监控程序启动失败重试的次数,默认3次,当超过3次后,supervisor将把此进程的状态置为FAIL
;exitcodes=0,2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 期望的退出码,默认0,2,即当退出码不为02时,认为是unexpected的。
;stopsignal=QUIT &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 进程停止信号,可以为TERM, HUP, INT, QUIT, KILL, USR1, USR2等,默认TERM
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 当用设定的信号去干掉进程,退出码会被认为是expected
;stopwaitsecs=10 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 最长结束等待时间,否则使用 SIGKILL,默认10
;stopasgroup=false &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 向unix进程组发送停止信号,默认false,适用于supervisord管理的子进程本身还有子进程的情况
;killasgroup=false &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 向unix进程组发送SIGKILL信号,默认false,适用于supervisord管理的子进程本身还有子进程的情况
;user=root &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 为运行程序的unix帐号设置setuid
;redirect_stderr=true &nbsp; &nbsp; &nbsp; &nbsp;  ; 重定向程序的标准错误到标准输出,默认false
;stdout_logfile=/a/path &nbsp; &nbsp; &nbsp;  ; 标准输出的日志路径。可以指定路径,AUTO,none等三个选项。
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 建议指定路径,使用AUTO选项的话,每次reload的时候都会在childlogdir下生成一个"process_name-随机字符串.log"文件
;stdout_logfile_maxbytes=1MB &nbsp; ; 日志文件最大值,否则循环写入 (default 50MB)
;stdout_logfile_backups=10 &nbsp; &nbsp; ; 标准输出日志备份数目 (default 10)
;stdout_capture_maxbytes=1MB &nbsp; ; 定capture管道的大小,当值不为0的时候,子进程可以从stdout发送信息,而supervisor可以根据信息,发送相应的event。
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 默认为0,为0的时候表示关闭管道
;stdout_events_enabled=false &nbsp; ; 当设置为ture的时候,当子进程由stdout向文件描述符中写日志的时候,将
 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 触发supervisord发送PROCESS_LOG_STDOUT类型的event,默认为false
;stderr_logfile=/a/path &nbsp; &nbsp; &nbsp;  ; 标准错误输出日志路径, 和stdout_logfile选项类似
;stderr_logfile_maxbytes=1MB &nbsp; ; 日志文件最大值,否则循环写入 (default 50MB)
;stderr_logfile_backups=10 &nbsp; &nbsp; ; 标准错误日志备份数目 (default 10)
;stderr_capture_maxbytes=1MB &nbsp; ; 和stdout_capture_maxbytes一样
;stderr_events_enabled=false &nbsp; ; 和stdout_events_enabled一样
;environment=A=1,B=2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 进程附加环境,这个是该子进程的环境变量,和别的子进程是不共享的
;serverurl=AUTO &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  ; override serverurl computation (childutils)

; The below sample eventlistener section shows all possible
; eventlistener subsection values, create one or more 'real'
; eventlistener: sections to be able to handle event notifications
; sent by supervisor.
; 下面是事件监听器的可选配置, supervisor能够处理事件通知.
; eventlistener和program的地位是一样的,也是suopervisor启动的子进程,配置和program相似
; listener的实现可以参考这篇文章 https://www.haoyizebo.com/posts/7f55f825/

;[eventlistener:theeventlistenername]
;command=/bin/eventlistener &nbsp;  ; 运行的程序 (相对使用PATH路径, 可以使用参数)
;process_name=%(program_name)s ; 进程名表达式,默认为%(program_name)s
;numprocs=1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  ; 默认启动的进程数目,默认为1
;events=EVENT &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  ; event事件的类型,comma-separated,只有写在这个地方的事件类型才会被发送
;buffer_size=10 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  ; 事件缓冲区队列大小,默认10
;directory=/tmp &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  ; 在运行前cwd到指定的目录,默认不执行cmd
;umask=022 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 进程umask,默认None
;priority=-1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 程序运行的优先级,默认-1
;autostart=true &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  ; 默认随supervisord自动启动,默认true
;autorestart=unexpected &nbsp; &nbsp; &nbsp;  ; whether/when to restart (default: unexpected)
;startsecs=1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; number of secs prog must stay running (def. 1)
;startretries=3 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  ; max # of serial start failures (default 3)
;exitcodes=0,2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 期望的退出码,默认0,2
;stopsignal=QUIT &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 杀死进程的信号,默认TERM
;stopwaitsecs=10 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; max num secs to wait b4 SIGKILL (default 10)
;stopasgroup=false &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 向unix进程组发送停止信号,默认false
;killasgroup=false &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 向unix进程组发送SIGKILL信号,默认false
;user=chrism &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; setuid to this UNIX account to run the program
;redirect_stderr=true &nbsp; &nbsp; &nbsp; &nbsp;  ; redirect proc stderr to stdout (default false)
;stdout_logfile=/a/path &nbsp; &nbsp; &nbsp;  ; stdout log path, NONE for none; default AUTO
;stdout_logfile_maxbytes=1MB &nbsp; ; max # logfile bytes b4 rotation (default 50MB)
;stdout_logfile_backups=10 &nbsp; &nbsp; ; # of stdout logfile backups (default 10)
;stdout_events_enabled=false &nbsp; ; emit events on stdout writes (default false)
;stderr_logfile=/a/path &nbsp; &nbsp; &nbsp;  ; stderr log path, NONE for none; default AUTO
;stderr_logfile_maxbytes=1MB &nbsp; ; max # logfile bytes b4 rotation (default 50MB)
;stderr_logfile_backups &nbsp; &nbsp; &nbsp;  ; # of stderr logfile backups (default 10)
;stderr_events_enabled=false &nbsp; ; emit events on stderr writes (default false)
;environment=A=1,B=2 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; process environment additions
;serverurl=AUTO &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  ; override serverurl computation (childutils)

; The below sample group section shows all possible group values,
; create one or more 'real' group: sections to create "heterogeneous"
; process groups.
; 下面是进程组的可选配置,可以创建一个或多个进程组。
; 注意:program被划分到组里面之后,就相当于原来的配置从supervisor的配置文件里消失了,
; supervisor只会对组进行管理,而不再会对组里面的单个program进行管理了

[group:appgroup]
programs=wapp,wfapp &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 这里的进程名是上文 [program:x] 的 x
;priority=999 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ; 程序运行的优先级,默认999

; The [include] section can just contain the "files" setting.  This
; setting can list multiple files (separated by whitespace or
; newlines).  It can also contain wildcards.  The filenames are
; interpreted as relative to this file.  Included files *cannot*
; include files themselves.
; 这个东西挺有用的,当我们要管理的进程很多的时候,写在一个文件里面就有点大了。
; 我们可以把配置信息写到多个文件中,然后include过来

;[include]
;files = relative/directory/*.ini

; 配置一组进程,对于类似的program可以通过这种方式添加,避免手工一个个添加
;[program:bsapp]
;command=/usr1/app/run/%(program_name)s_%(process_num)02d wapp /usr1/app/log/%(program_name)s_%(process_num)02d.tr
;numprocs=3
;process_name=%(program_name)s_%(process_num)02d
;autostart=true
;autorestart=true</span><span style="font-family: 微软雅黑, 'Microsoft YaHei', Oswald, 'Helvetica Neue', Helvetica, Verdana, arial, sans-serif;">
作者:zws  创建时间:2026-05-16 23:27
最后编辑:zws  更新时间:2026-05-24 17:28
上一篇:
下一篇: