supervisor
Supervisor 是一个用 Python 写的进程管理工具,可以很方便的用来在 UNIX-like 系统(不支持 Windows)下启动、重启(自动重启程序)、关闭进程(不仅仅是 Python 进程)。
安装:
apt-get install supervisor/pip install supervisor
Supervisor 是一个用 Python 编写的进程管理工具,用于在类 Unix 系统上监控和控制应用程序进程。它能在进程异常退出时自动重启,确保关键服务持续运行,并提供了集中式的管理方式
它的核心价值在于:将你需要手动维护的进程,转变为由守护进程自动监控和管理的服务。
Supervisor 系统主要由以下四个部分组成
supervisord:服务端守护进程。这是 Supervisor 的核心,负责启动所管理的子进程,响应客户端的命令,并在子进程异常退出时自动重启。它是所有被管理进程的父进程。
supervisorctl:命令行客户端。为用户提供一个与
supervisord交互的界面(类似 shell),通过它可以查看进程状态、启动、停止、重启进程。Web Server:Web 管理界面。提供了一个通过浏览器访问的 GUI,通常运行在
9001端口,功能与supervisorctl类似。XML-RPC Interface:编程接口。提供了 XML-RPC API,允许开发者通过编程方式查询和控制进程,便于集成到其他运维工具或自动化脚本中。
supervisord 作为核心守护进程,通过 fork/exec 的方式启动和管理所有配置好的子进程,并时刻监视它们的状态。
配置
主配置文件:
/etc/supervisord.conf子进程配置目录:
/etc/supervisord.d/或/etc/supervisor/conf.d/。通常在主配置文件中通过[include]节引入此目录下的所有*.conf文件,便于管理多个应用
supervisor启动时未指定-c选项时,会按照以下顺序查看配置文件。
../etc/supervisord.conf(Relative to the executable)../supervisord.conf(Relative to the executable)$CWD/supervisord.conf$CWD/etc/supervisord.conf/etc/supervisord.conf/etc/supervisor/supervisord.conf(since Supervisor 3.3.0)
应用配置
配置块
主要作用
常用配置项及说明
[unix_http_server]
配置本地 UNIX Socket 通信,供 supervisorctl 命令行工具使用
。
• file=/var/run/supervisor.sock: Socket 文件路径
。
• chmod=0700: Socket 文件权限
。
• chown=nobody:nogroup: Socket 文件属主和属组
。
• username & password: 连接认证(可选)
。
[inet_http_server]
启用 Web 管理界面,可通过浏览器查看和管理进程 。
• port=127.0.0.1:9001: 监听IP和端口(设置为 0.0.0.0:9001 可从网络访问)
。
• username=admin: 登录用户名
。
• password=your_password: 登录密码
。
[supervisord]
supervisord 主进程 的全局配置,如日志、PID文件等
。
• logfile=/var/log/supervisor/supervisord.log: 主进程日志路径
。
• logfile_maxbytes=50MB: 单个日志文件最大容量
。
• logfile_backups=10: 日志备份数量
。
• pidfile=/var/run/supervisord.pid: PID 文件路径
。
• nodaemon=false: 以守护进程方式运行
。
[supervisorctl]
配置 supervisorctl 客户端 如何连接到服务端
。
• serverurl=unix:///var/run/supervisor.sock: 通过 UNIX socket 连接(默认方式)
。
• serverurl=http://127.0.0.1:9001: 通过 HTTP 连接(需与 [inet_http_server] 配置一致)
。
[program:*]
(最重要)
定义要管理的应用程序,这是最常用的配置块。*代表程序名,如 [program:myapp]
。
• command=/path/to/your/command: 启动命令(必须为前台非守护模式)
。
• directory=/path/to/workdir: 命令执行时的工作目录
。
• user=www-data: 以指定用户身份运行进程
。
• autostart=true: Supervisor 启动时,该程序是否自动启动
。
• autorestart=true/unexpected: 程序退出后是否自动重启(推荐 unexpected,仅在非预期退出时重启)
。
• startsecs=5: 进程启动后持续运行5秒则认为成功
。
• startretries=3: 启动失败后的重试次数
。
• stopsignal=TERM: 停止进程时发送的信号
。
• stopwaitsecs=10: 发送停止信号后等待强制杀死的秒数
。
• stdout_logfile=/path/to/logfile.log: 标准输出日志路径
。
• stderr_logfile=/path/to/error.log: 标准错误日志路径
。
• redirect_stderr=true: 将 stderr 重定向到 stdout,便于日志统一管理
。
• environment=KEY="value": 设置环境变量(如 PATH="/usr/bin")
。
[group:*]
将多个 [program] 合并成一个组,方便统一管理(启动、停止)
。
• programs=progname1,progname2: 包含的程序名称列表
。
• priority=999: 组启动的优先级(值越小优先级越高)
。
[include]
包含其他配置文件,实现配置的模块化管理,是最佳实践 。
• files = /etc/supervisor/conf.d/*.conf: 包含指定目录下的所有 .conf 文件。通常将每个程序的配置单独放在此目录下
。
[rpcinterface:supervisor]
定义 RPC(远程过程调用)接口,供 Web 界面和 supervisorctl 使用,通常无需修改
。
• supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface: 标准配置,保持默认即可
。
配置块 (Section)
是否必须
主要作用
备注
[unix_http_server]
否
配置用于本地通信的 UNIX Socket,供 supervisorctl 命令行工具使用。
禁用后,supervisorctl 将无法连接,但 supervisord 仍可运行。
[inet_http_server]
否
启用 Web 管理界面,可通过浏览器查看和管理进程。
默认不开启,需取消注释并配置才生效。
[supervisord]
是
全局配置核心。定义 supervisord 主进程 自身的参数,如日志、PID 文件等。
如果没有该块,supervisord 将无法正常运行或无法确定其行为。
[rpcinterface:supervisor]
是
定义 RPC(远程过程调用)接口,是 Web 界面和 supervisorctl 能够工作的基础。
官方注明必须保留此部分。
[supervisorctl]
否
配置 supervisorctl 客户端 如何连接到 supervisord 服务端。
不配置时会尝试使用默认连接方式。
[program:*]
功能上必需
定义要管理的应用程序。这是你添加需要被监控和管理服务的地方。
没有 [program:*] 或 [group:*] 块,Supervisor 就没有需要管理的进程。
[group:*]
否
将多个 [program] 归为一个组,方便统一管理。
用于逻辑管理,非必需。
[include]
强烈推荐
包含其他配置文件(如 /etc/supervisor/conf.d/*.conf),实现配置的模块化管理。
最佳实践。将每个程序的配置放在单独文件中,便于管理。
识别所有
[program:*]块 → 转换为 ProcessConfig 对象识别所有
[group:*]块 → 转换为 GroupConfig 对象建立 program 与 group 的映射关系
在 /etc/supervisord.d/ 目录下为你的应用创建一个配置文件,例如 my_app.conf:
command:必须非后台运行。Supervisor 需要通过管理前台进程来跟踪状态。若命令本身有&或类似-d的参数,需去除。autorestart:设为true或unexpected是实现“自动重启”核心功能的关键。stdout_logfile,stderr_logfile:Supervisor 会捕获并重定向子进程的输出到这些日志文件,并支持日志轮转(maxbytes,backups)。
命令行
supervisorctl status
查看所有进程状态(最常用)
supervisorctl status
supervisorctl start <name>
启动某个进程
supervisorctl start celery_worker
supervisorctl stop <name>
停止某个进程
supervisorctl stop web_app
supervisorctl restart <name>
重启某个进程
supervisorctl restart nginx
supervisorctl signal <name>
向进程发送信号
supervisorctl signal nginx STOP
状态解读
supervisorctl status 的输出结果通常如下:
常见状态:
RUNNING: 进程正常运行中。STARTING: 进程正在启动。STOPPED: 进程已停止。BACKOFF: 进程启动失败,正在重试(检查startretries配置)。FATAL: 进程启动失败,且重试次数已用尽。EXITED: 进程正常退出(但autorestart可能又会把它拉起来)。
批量管理
当配置了 [group:*] 块时,可以对整个组进行操作。
supervisorctl start <group>:*
启动组内所有进程
supervisorctl start web_services:*
supervisorctl stop <group>:*
停止组内所有进程
supervisorctl stop workers:*
supervisorctl restart <group>:*
重启组内所有进程
supervisorctl restart all:*
supervisorctl status <group>:*
查看组内所有进程状态
supervisorctl status data_sync:*
supervisorctl start all
启动所有进程
supervisorctl start all
supervisorctl stop all
停止所有进程
supervisorctl stop all
supervisorctl restart all
重启所有进程
supervisorctl restart all
配置更新与重载
修改任何配置文件后,必须使用这些命令使更改生效。
supervisorctl reread
重新读取配置文件。检测是否有新增或修改的进程配置,但不会重启任何已有进程。
supervisorctl reread
supervisorctl update
更新进程。根据 reread 的结果,启动新添加的进程,重启配置有变动的进程。对无变动的进程无影响。
supervisorctl update
supervisorctl reload
重启 supervisord 主进程本身,并重新加载整个配置文件。这会中断所有现有连接,并重新启动所有配置为 autostart=true 的进程。
supervisorctl reload
可以结合reread和update更新修改过配置的进程。
日志查看
用于实时监控或排查进程问题。
supervisorctl tail <name>
查看进程的最后日志(默认 stdout)
supervisorctl tail redis
supervisorctl tail -f <name>
持续跟踪(follow)进程的 stdout 日志
supervisorctl tail -f web_app
supervisorctl tail -f <name> stderr
持续跟踪进程的 stderr(错误)日志
supervisorctl tail -f web_app stderr
supervisorctl tail -f <name> stdout
明确指定持续跟踪 stdout(标准输出)日志
supervisorctl tail -f celery stdout
最后更新于