Supervisor 是什么?
Supervisor 是一个用 Python 开发的进程管理工具,用于在类 Unix 系统上监控、启动、停止和重启后台进程(守护进程)。
核心功能
| 功能 | 说明 |
|---|---|
| 进程监控 | 实时监控子进程状态,崩溃后自动重启 |
| 生命周期管理 | 统一启动、停止、重启所有服务 |
| 日志管理 | 自动收集和管理进程的 stdout/stderr 输出 |
| 配置简单 | 使用 INI 格式配置文件,易于理解和维护 |
| 多进程管理 | 一个 Supervisord 可以管理多个进程 |
| Web 界面 | 提供 Web 界面可视化操作(可选) |
| 命令行工具 | supervisorctl 命令行操作 |
架构组成
┌─────────────────────────────────────────────────────┐
│ 用户/系统 │
└─────────────────────────────────────────────────────┘
│
▼
┌──────────────────┐
│ supervisorctl │ ◄── 命令行管理工具
└──────────────────┘
│
▼
┌──────────────────┐
│ supervisord │ ◄── 主进程(守护进程)
└──────────────────┘
│
┌───────────────┼───────────────┐
▼ ▼ ▼
┌─────────┐ ┌─────────┐ ┌─────────┐
│子进程 1 │ │子进程 2 │ │子进程 3 │ ◄── 被管理的应用
│(Java) │ │(Python) │ │(Nginx) │
└─────────┘ └─────────┘ └─────────┘
两个核心组件
-
supervisord(服务端)
- 后台运行的守护进程
- 负责启动、监控和管理子进程
- 读取配置文件
-
supervisorctl(客户端)
- 命令行工具
- 连接 supervisord 发送管理命令
- 查看状态、启动/停止进程
典型应用场景
1. 代替 nohup 后台运行
# ❌ 不推荐:无法自动重启,难以管理
nohup java -jar app.jar &
# ✅ 推荐:用 Supervisor 管理
[program:myapp]
command=java -jar /app/app.jar
autorestart=true
2. 高可用保障
# 进程崩溃后自动重启(3秒内)
autorestart=true
startretries=5
3. 批量管理微服务
# 一次命令重启所有服务
supervisorctl restart all
# 或重启某个组
supervisorctl restart backend:*
4. 容器/虚拟机环境
- Docker 容器内作为 PID 1 进程
- 管理容器内的多个服务
配置文件示例
; /etc/supervisor/conf.d/myapp.conf
[program:myapp]
command=java -jar /app/myapp.jar ; 启动命令
directory=/app ; 工作目录
user=root ; 运行用户
autostart=true ; supervisord 启动时自动启动
autorestart=true ; 进程退出后自动重启
startretries=5 ; 重启重试次数
startsecs=10 ; 启动后认为成功的时间(秒)
stopasgroup=true ; 停止整个进程组
killasgroup=true ; 杀死整个进程组
stdout_logfile=/var/log/myapp.log ; 标准输出日志
stderr_logfile=/var/log/myapp.err ; 错误日志
与其他工具对比
| 工具 | 特点 | 适用场景 |
|---|---|---|
| Supervisor | Python 实现,配置简单,进程管理 | 传统 VM/物理机,中小规模 |
| Systemd | Linux 内置,功能强大 | 现代 Linux 系统(主流) |
| PM2 | Node.js 实现,生态丰富 | Node.js 应用 |
| Docker/K8s | 容器化,自动恢复 | 云原生环境 |
| Monit | 轻量级,系统监控 | 轻量监控 + 进程管理 |
| runit | 轻量级,简单可靠 | 嵌入式系统 |
为什么用 Supervisor 而不是 Systemd?
| 对比项 | Supervisor | Systemd |
|---|---|---|
| 简单性 | ✅ 配置简单(INI 格式) | ⚠️ 较复杂 |
| 跨平台 | ✅ macOS/Linux/BSD | ❌ 仅 Linux |
| 开发环境 | ✅ 易于本地测试 | ⚠️ 需要系统权限 |
| 日志管理 | ✅ 自动收集输出 | ✅ 通过 journalctl |
| Web 界面 | ✅ 内置 Web UI | ❌ 默认无 |
| 非 Root 用户 | ✅ 可运行 | ⚠️ 部分功能受限 |
| 依赖 | Python | 系统自带 |
安装和使用
安装
# Ubuntu/Debian
sudo apt-get install supervisor
# CentOS/RHEL
sudo yum install supervisor
# 使用 pip
pip install supervisor
启动
# 启动 supervisord
supervisord -c /etc/supervisor/supervisord.conf
# 设置开机自启(Ubuntu)
sudo systemctl enable supervisor
sudo systemctl start supervisor
管理命令
# 查看状态
supervisorctl status
# 启动应用
supervisorctl start myapp
# 停止应用
supervisorctl stop myapp
# 重启应用
supervisorctl restart myapp
# 重新加载配置
supervisorctl reread
supervisorctl update
Supervisor 在容器中的应用
在 Docker 中使用 Supervisor:
FROM ubuntu:20.04
# 安装 supervisor
RUN apt-get update && apt-get install -y supervisor
# 复制 supervisor 配置
COPY supervisord.conf /etc/supervisor/supervisord.conf
COPY myapp.conf /etc/supervisor/conf.d/
# 启动 supervisor(作为 PID 1)
CMD ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisor/supervisord.conf"]
好处:
- 一个容器运行多个服务(不推荐,但有时需要)
- 服务的自动恢复
- 统一日志收集
Supervisor 的局限性
| 问题 | 说明 | 解决方案 |
|---|---|---|
| 不支持 Windows | 仅类 Unix 系统 | 使用 Windows 服务 |
| 单点故障 | supervisord 本身可能崩溃 | 使用 Systemd 守护 |
| 进程管理有限 | 只能管理前台进程 | 确保进程不以 daemon 模式运行 |
| 配置重启 | 修改配置需要 reload | 使用 update 命令 |
| 资源限制 | 不能限制 CPU/内存 | 配合 cgroups/ulimit |
| 日志轮转 | 功能有限 | 配合 logrotate |
与你之前服务的结合
你之前提到的 maxvision-bp-acs 服务,用 Supervisor 管理后:
优势:
- ✅ 自动重启:服务崩溃后 3 秒内自动拉起
- ✅ 统一管理:所有微服务通过
supervisorctl统一控制 - ✅ 日志集中:输出自动保存到
/var/log/supervisor/ - ✅ 多环境配置:通过环境变量灵活切换
典型工作流:
# 1. 修改代码,打包 JAR
mvn clean package
# 2. 停止服务
supervisorctl stop maxvision-bp-acs
# 3. 替换 JAR 包
cp target/app.jar /app/maxvision-bp-acs.jar
# 4. 启动服务
supervisorctl start maxvision-bp-acs
# 5. 查看日志验证
supervisorctl tail -f maxvision-bp-acs
总结
Supervisor 是一个轻量级但功能强大的进程管理工具,特别适合:
- 🚀 替代 nohup 管理后台服务
- 🔄 自动重启 保障高可用
- 📊 统一管理 微服务集群
- 🛠️ 简化运维 降低管理成本
类比:Supervisor 之于进程,就像 systemd 之于系统,但更简单、更轻量、更易用。

1809

被折叠的 条评论
为什么被折叠?



