一、为什么需要 Supervisor?
在分布式生产环境或容器微服务中,我们经常需要后台运行大量的常驻服务进程(如 Python Flask/FastAPI、Celery 异步消费者、Go 后台监控、Shell 任务同步脚本)。
如果仅仅通过 nohup python app.py & 裸跑后台:
- 进程缺乏自愈机制:一旦因内存 OOM 或未捕获异常退出,进程就此死掉,业务服务直接中断;
- 缺乏统一管控:数十个后台任务的启动、停止、重启需要人工在
ps -ef中找 PID 并执行kill,管理极度混乱; - 日志容易丢失:进程标准输出与错误日志缺乏自动归档与切分机制。
Supervisor 是一款用 Python 开发的成熟进程控制系统,专门用于在类 Unix 系统中集中管理与守护大量子进程。
二、Supervisor 核心组件与拓扑模型
Supervisor 主要由两部分协同运作:
text
┌────────────────────────────────────────────────────────┐
│ supervisorctl (命令行控制客户端) │
│ • 启动/停止/重启子进程 • 查看进程实时运行状态 │
└───────────────────────────▲────────────────────────────┘
│ UNIX Domain Socket / TCP
┌───────────────────────────▼────────────────────────────┐
│ supervisord (核心守护进程) │
│ • 维护子进程生命周期树 • 子进程崩溃自动重启 (autorestart)│
│ • 集中捕获 stdout/stderr • 自动文件轮转与大小控制 │
└───────────────▲────────────────────────▲───────────────┘
│ fork & exec │ fork & exec
┌───────┴────────┐ ┌───────┴────────┐
│ 业务进程 A │ │ 异步消费者 B │
│ (FastAPI API) │ │ (Celery Worker)│
└────────────────┘ └────────────────┘supervisord:后台常驻守护进程。负责响应管理请求、按顺序拉起子进程,并在子进程异常崩溃时自动重启;supervisorctl:CLI 客户端交互工具,通过 Unix Socket 向服务端下发控制指令。
三、快速安装与初始化
在 Linux 生产节点安装与初始化:
bash
# 1. 使用 pip 安装 supervisor
pip install supervisor
# 2. 生成默认配置文件样本
echo_supervisord_conf > /etc/supervisord.conf
# 3. 推荐开启 conf.d 动态包含目录
mkdir -p /etc/supervisor/conf.d编辑 /etc/supervisord.conf 文件底部,取消包含注释:
ini
[include]
files = /etc/supervisor/conf.d/*.conf四、生产项目进程托管配置实战
在 /etc/supervisor/conf.d/ 目录下为具体业务编写独立的进程托管文件(如 app_worker.conf):
ini
[program:data_analysis_worker]
; 启动命令(必须为前台运行命令,严禁加 & 后台符号)
command=/usr/bin/python3 /opt/services/analysis/worker.py
; 运行工作目录
directory=/opt/services/analysis
; 启动服务的系统用户
user=deployer
; 随 supervisord 启动而自动启动
autostart=true
; 进程崩溃非正常退出时自动拉起重启(关键高可用保障)
autorestart=true
; 启动 10 秒后未退出则判定启动成功
startsecs=10
; 连续启动失败重试次数上限
startretries=3
; 进程退出信号量与优雅停机超时
stopsignal=TERM
stopwaitsecs=15
; 标准输出与错误日志自动归档与切分配置
stdout_logfile=/var/log/supervisor/analysis_stdout.log
stdout_logfile_maxbytes=50MB ; 单文件达 50MB 自动轮转
stdout_logfile_backups=5 ; 保留 5 份历史备份
stderr_logfile=/var/log/supervisor/analysis_stderr.log
stderr_logfile_maxbytes=20MB
stderr_logfile_backups=3
; 注入环境变量
environment=ENV="production",LOG_LEVEL="INFO"五、常用维护与动态刷新指令
启动 supervisord 服务端:
bash
supervisord -c /etc/supervisord.conf日常使用 supervisorctl 管理所有进程:
bash
# 查看所有托管进程的运行状态、PID 与持续运行时间
supervisorctl status
# 动态重载配置(新加入的 conf 会被加载,已有未改动进程不受影响)
supervisorctl reread
supervisorctl update
# 单个或批量启停控制
supervisorctl restart data_analysis_worker
supervisorctl stop all
supervisorctl start all