Skip to content

一、为什么需要 Supervisor? ​

在分布式生产环境或容器微服务中,我们经常需要后台运行大量的常驻服务进程(如 Python Flask/FastAPI、Celery 异步消费者、Go 后台监控、Shell 任务同步脚本)。

如果仅仅通过 nohup python app.py & 裸跑后台:

  1. 进程缺乏自愈机制:一旦因内存 OOM 或未捕获异常退出,进程就此死掉,业务服务直接中断;
  2. 缺乏统一管控:数十个后台任务的启动、停止、重启需要人工在 ps -ef 中找 PID 并执行 kill,管理极度混乱;
  3. 日志容易丢失:进程标准输出与错误日志缺乏自动归档与切分机制。

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

测试开发工程师 · 专注自动化与系统架构 | 邮箱: hansblog@atumsoul.win