Linux进程守护supervisor配置
运维过 Linux 服务器的朋友一定遇到过:程序跑着跑着就挂了,或者重启后没有自动拉起。
手动重启一次两次还能忍,如果天天半夜爬起来敲命令,那绝对要疯。
这时候就需要 进程守护工具 出场了。
supervisor 是目前最主流的 Linux 进程守护方案之一,用 Python 写成,安装简单,配置灵活,特别适合守护常驻后台的脚本、队列、微服务等。
为什么不用系统自带 systemd?
很多人会问:CentOS 7 以上不是自带 systemd 吗?
systemd 确实可以做进程守护,但对新手来说配置门槛偏高,而且调试起来不够直观。
supervisor 的配置文件语法更清晰,支持图形化管理(通过 web 界面),并且用户级安装不需要 root 权限,容器环境里也经常用它。
如果你的场景是管理少量用户进程,supervisor 明显更顺手。
安装 supervisor:两条命令搞定
不管你是 Ubuntu 还是 CentOS,安装都很简单。
Ubuntu / Debian 系列
sudo apt update
sudo apt install supervisor -y
CentOS / RHEL 系列
sudo yum install epel-release -y
sudo yum install supervisor -y
安装完成后,supervisor 会自动注册为 systemd 服务。
检查一下状态:
sudo systemctl status supervisord
如果显示 active (running) 就说明成功了。
如果没启动,手动启动一下:
sudo systemctl enable supervisord --now
编写第一个进程配置文件
supervisor 的配置文件默认放在 /etc/supervisor/supervisord.conf,
但通常我们不直接改主配置,
而是在 /etc/supervisor/conf.d/ 目录下放各个进程的独立配置文件。
假设你要守护一个简单的 Python 脚本 /home/test/myapp.py,它的作用是每隔 5 秒往日志里写一行时间。
我们先创建配置文件:
sudo vim /etc/supervisor/conf.d/myapp.conf
填入以下内容:
[program:myapp]
command=python3 /home/test/myapp.py
directory=/home/test
autostart=true
autorestart=true
startretries=3
stderr_logfile=/var/log/myapp.err.log
stdout_logfile=/var/log/myapp.out.log
user=root
关键字段说明:
[program:myapp]:这个程序的名字叫 myapp,后面管理时会用到。command:要执行的命令,写完整路径更安全。directory:工作目录。autostart:supervisor 启动时自动拉起该进程。autorestart:进程意外退出时自动重启。startretries:启动失败时重试次数。user:以哪个用户运行,建议和程序所属用户一致,避免权限问题。
写好后保存退出,然后让 supervisor 载入新配置:
sudo supervisorctl reread
sudo supervisorctl update
看到 myapp: available 或 myapp: added process group 就说明成功了。
启动与管理进程
载入配置后,进程不会自动启动,还需要手动启动一次:
sudo supervisorctl start myapp
查看所有进程状态:
sudo supervisorctl status
如果显示 myapp RUNNING pid xxxx 就说明已经跑起来了。
你也可以用 stop、restart 来管理。
常用命令速查
supervisorctl reread:重新读取配置文件(新增或删除程序时用)supervisorctl update:根据 reread 结果更新进程组supervisorctl status:查看所有进程状态supervisorctl start/stop/restart 程序名:管理单个进程supervisorctl tail -f 程序名:实时查看该进程的 stdout 日志
常见问题与避坑说明
1. 配置文件语法错误导致进程未启动
写错一个冒号或者少写一个等号,reread 可能不报错,但 update 会提示错误。
建议用在线 INI 工具检查格式,或者先手动执行一遍命令确认能跑。
2. 日志文件权限问题
如果日志文件没有写入权限,进程会启动失败。
可以在配置里指定一个已有权限的目录,比如 /tmp/ 或者 目录的所有者设为配置中的 user。
3. autorestart 不生效?
检查配置是否写了 autorestart=true,另外如果进程是因为正常退出(比如主动 exit 0)也会被重新拉起来。
如果你希望只有非正常退出时才重启,可以改成 autorestart=unexpected。
4. 进程启动后立刻退出导致循环重启
如果你的程序本身有 bug,一启动就退出了,supervisor 会按照 startretries 重试,重试耗尽后该进程会进入 FATAL 状态,不再自动重启。
这时候应该先排查程序日志,而不是改 supervisor。
验证自动重启效果
为了确认 supervisor 确实能守护进程,简单测试一下:
# 先查看当前进程 PID
sudo supervisorctl status myapp
# 手动杀死这个进程
sudo kill -9 <进程PID>
# 等一两秒再查看状态
sudo supervisorctl status myapp
正常会看到进程又被重新拉起,PID 变成新的。
你也可以查看日志文件 /var/log/myapp.out.log,应该能看到重启后的新输出。
如果你正在处理 Linux 进程守护 supervisor 配置,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。
掌握了这套基础后,你还可以进一步配置 web 管理界面、设置日志轮转、管理多个进程组等高级玩法。