Supervisor 进程管理
概述
Supervisor 是一个 进程管理工具,将应用程序作为子进程交给它托管。它解决了生产环境两大运维痛点:
- 后台运行 — 自动将子进程放入后台,无需
nohup或& - 故障自愈 — 监控子进程状态,崩溃后自动拉起
核心功能
| 功能 | 说明 | 解决的问题 |
|---|---|---|
| 后台运行 | 自动 daemonize 子进程 | 替代 nohup ... & |
| 自动重启 | 进程崩溃时立即拉起 | 故障自愈,减少停机时间 |
| 统一管理 | supervisorctl 管理所有进程 | 替代分散的 PID 管理 |
| 日志管理 | 自动捕获 stdout/stderr | 统一日志收集 |
架构
┌─────────────────────────────┐
│ supervisord │ ← 守护进程(服务端)
│ (由 systemd 管理) │
├─────────────────────────────┤
│ ┌─ program:uwsgi ───────┐ │ ← 子进程 1: Python uWSGI
│ │ uwsgi --ini uwsgi.ini │ │
│ └────────────────────────┘ │
│ ┌─ program:chitchat ────┐ │ ← 子进程 2: Go 二进制
│ │ /go_pro/./chitchat │ │
│ └────────────────────────┘ │
└─────────────────────────────┘
↕ supervisorctl
命令行管理工具
组件说明
| 组件 | 角色 | 说明 |
|---|---|---|
| supervisord | 服务端守护进程 | 由 systemd 管理(systemctl start supervisord),负责启动/监控子进程 |
| supervisorctl | 命令行客户端 | 向 supervisord 发送管理指令(status/start/stop/restart) |
安装与配置
安装
# CentOS
yum install supervisor -y
systemctl start supervisord
systemctl enable supervisord配置文件结构
/etc/supervisord.conf # 主配置文件(含全局配置)
/etc/supervisord.d/*.ini # 程序配置目录(每个程序一个 .ini 文件)
程序配置示例
管理 uWSGI 服务:
# /etc/supervisord.d/uwsgi.ini
[program:uwsgi]
command=/usr/local/bin/uwsgi --ini /blog/uwsgi.ini
directory=/blog
autostart=true
autorestart=true
startretries=3
user=root
redirect_stderr=true
stdout_logfile=/var/log/supervisor/uwsgi.log管理 Go 二进制服务:
# /etc/supervisord.d/chitchat.ini
[program:chitchat]
command=/go_pro/chitchat-master/chitchat
directory=/go_pro/chitchat-master
autostart=true
autorestart=true
startretries=3
user=root
redirect_stderr=true
stdout_logfile=/var/log/supervisor/chitchat.log配置参数详解
| 参数 | 说明 |
|---|---|
[program:xxx] | 程序名称,用于 supervisorctl 管理时标识 |
command | 要执行的启动命令(绝对路径) |
directory | 执行命令前切换到此工作目录 |
autostart=true | supervisord 启动时自动启动该程序 |
autorestart=true | 程序异常退出后自动重启 |
startretries=3 | 自动重启的最大尝试次数 |
user=root | 以哪个用户身份运行 |
redirect_stderr=true | 将 stderr 重定向到 stdout(日志统一) |
stdout_logfile | 日志输出文件路径 |
管理命令
# 读取配置(添加/修改 .ini 文件后执行)
supervisorctl reread # 检测配置文件变化
supervisorctl update # 应用变化(启动新增/更新的程序)
# 进程管理
supervisorctl status # 查看所有子进程状态
supervisorctl start uwsgi # 启动指定程序
supervisorctl stop uwsgi # 停止指定程序
supervisorctl restart uwsgi # 重启指定程序
supervisorctl start all # 启动所有程序
supervisorctl stop all # 停止所有程序典型工作流
# 1. 修改或新增配置
vim /etc/supervisord.d/uwsgi.ini
# 2. 重新加载
supervisorctl reread
supervisorctl update
# 3. 检查状态
supervisorctl status适用场景
| 场景 | 推荐方案 | 原因 |
|---|---|---|
| Python uWSGI 应用 | Supervisor + uWSGI | uWSGI 虽有 master 进程,但本身无法自愈 |
| Go 二进制服务 | Supervisor + Go 二进制 | Go 无内置进程管理,Supervisor 补位 |
| 多微服务同机部署 | Supervisor 统一管理 | 一个 supervisorctl status 查看所有服务状态 |
| 非 Python/Go 的脚本/服务 | Supervisor + 任意命令 | 任何命令行程序都可托管 |
补充说明:uWSGI 本身有 master 进程和
max-requests自动重启机制,但 master 进程崩溃时 需要外部进程管理工具来拉起。Supervisor 正是填补这一层保障。
参见
- Go 程序部署 — Go 二进制 + Supervisor 典型组合
- Python 体系架构 — uWSGI + Supervisor 典型组合
- 架构对比总结 — 各语言进程管理方式差异
- day39 摘要 — 部署实操参考