跑在服务器上的程序,最怕的就是"无声无息地挂了":Python 脚本跑着跑着崩了、Node 服务内存溢出一命呜呼、PHP 队列消费进程半夜退出——等发现的时候,用户已经投诉半天了。systemd 能管系统服务,但管理开发环境、虚拟环境、自定义脚本时配置繁琐。Supervisor 是专门解决这个问题的进程守护工具:程序崩了自动重启、统一管理多个进程、日志自动切割,运维必备。
一、Supervisor 是什么
Supervisor 是一个用 Python 编写的进程管理工具,核心功能:
- 自动拉起:进程意外退出后自动重启
- 统一管理:用一条命令启停多个程序,还能查看运行状态
- 日志管理:自动收集 stdout/stderr 日志,支持按大小切割
- 开机自启:随系统启动自动运行受管进程
它特别适合管理:Python 脚本、Node 服务、队列消费者、爬虫程序、定时任务守护进程等。
二、安装 Supervisor
Ubuntu / Debian:
apt update && apt install -y supervisor
CentOS / Rocky:
yum install -y supervisor
安装完成后,启动服务并设为开机自启:
systemctl enable supervisor
systemctl start supervisor
systemctl status supervisor
三、配置一个受管进程
Supervisor 的配置文件位于 /etc/supervisor/conf.d/(Ubuntu)或 /etc/supervisord.d/(CentOS)。每个程序一个 .conf 文件。
示例 1:守护一个 Python 爬虫
创建 /etc/supervisor/conf.d/spider.conf:
[program:spider]
command=python3 /opt/spider/main.py ; 要执行的命令
directory=/opt/spider ; 工作目录
autostart=true ; 随 supervisor 启动
autorestart=true ; 进程退出后自动重启
stderr_logfile=/var/log/spider.err.log ; 错误日志
stdout_logfile=/var/log/spider.out.log ; 标准输出日志
user=root ; 运行用户
示例 2:守护一个 Node.js 服务
创建 /etc/supervisor/conf.d/nodeapp.conf:
[program:nodeapp]
command=node /opt/nodeapp/app.js
directory=/opt/nodeapp
autostart=true
autorestart=true
stopasgroup=true
killasgroup=true
stderr_logfile=/var/log/nodeapp.err.log
stdout_logfile=/var/log/nodeapp.out.log
environment=NODE_ENV="production"
四、加载配置并管理进程
修改或新增配置后,需要重新读取配置:
supervisorctl reread # 读取新配置
supervisorctl update # 应用配置变更(启动新程序)
日常管理命令:
supervisorctl status # 查看所有进程状态
supervisorctl start spider # 启动指定进程
supervisorctl stop spider # 停止指定进程
supervisorctl restart spider # 重启指定进程
supervisorctl restart all # 重启所有进程
supervisorctl reload # 重载全部配置
验证效果: 手动 kill 掉受管进程,几秒后 Supervisor 会自动把它拉起来:
kill -9 $(pgrep -f spider)
sleep 3
supervisorctl status
你会发现进程状态变为 RUNNING,重启次数在增加——这就是守护的意义。
五、日志管理配置
进程日志无限增长会撑爆磁盘,Supervisor 支持按大小和数量切割:
[supervisord]
logfile=/var/log/supervisord.log
logfile_maxbytes=50MB ; 单个日志文件上限
logfile_backups=10 ; 保留 10 个备份
[program:spider]
stdout_logfile=/var/log/spider.out.log
stdout_logfile_maxbytes=20MB
stdout_logfile_backups=5
stderr_logfile=/var/log/spider.err.log
stderr_logfile_maxbytes=20MB
stderr_logfile_backups=5
查看实时日志:
supervisorctl tail -f spider
六、进程组:一次管理多个进程
多个关联进程可以放进一个组,统一启停:
[program:worker1]
command=php /opt/app/queue.php --queue=high
process_name=%(program_name)s_%(process_num)02d
numprocs=4 ; 同时跑 4 个实例
directory=/opt/app
autostart=true
autorestart=true
supervisorctl status
supervisorctl restart worker1:*
这样一条命令就能重启同一程序的多个实例,非常适合队列消费者、Worker 场景。
七、Web 管理界面(可选)
Supervisor 自带一个 Web 界面,浏览器里就能管理进程。在 /etc/supervisor/supervisord.conf 中开启:
[inet_http_server]
port=0.0.0.0:9001
username=admin
password=你的密码
注意:Web 界面一定要设密码,并建议只监听内网或通过 SSH 隧道访问,避免暴露在公网被爆破。
八、开机自启问题排查
Q1:重启服务器后受管进程没起来?
检查两步:
1. supervisor 服务本身是否开机自启:systemctl is-enabled supervisor
2. 程序是否设置了 autostart=true
Q2:ERROR (no such process)?
配置没加载,先执行 supervisorctl reread && supervisorctl update。
Q3:程序一直重启但起不来?
看日志找原因:supervisorctl tail -f 程序名。常见原因是命令路径不对、依赖环境变量缺失。用绝对路径写 command,必要时加 environment 指定环境变量。
Q4:和 systemd 冲突吗?
不冲突。systemd 管理 supervisor 本身,supervisor 管理业务进程。如果业务进程需要 systemd 级别的隔离和依赖,直接用 systemd 更合适;管理开发脚本、多实例 Worker,supervisor 更轻便。
总结
Supervisor 解决的是"进程没人看管"的痛点:自动重启、统一管理、日志切割,一套搞定。装上它之后,脚本崩了会自己起来、日志不会撑爆磁盘、多实例一条命令管理——运维省心一大半。搭配本站的 Zabbix 监控教程,服务器 7x24 小时有人盯着。
