引言
本文将全面介绍 Supervisor 在 Linux 系统上的进程管理与日志策略,包括安装、配置、内置基于大小的日志轮转、结合 logrotate 实现基于时间的日志轮转,以及日志文件恢复与重开机制,帮助你在生产环境中灵活、高效地管理进程与日志。我们将基于官方文档及多篇实践经验总结,演示如何通过 logfile_maxbytes
/logfile_backups
和 stdout_logfile_maxbytes
/stdout_logfile_backups
控制日志大小与备份,并结合 logrotate
实现每日轮转与压缩。
简介
Supervisor 是一个客户端/服务器系统,用于在 Unix 操作系统上集中监控和控制一组进程,不作为 init
第 1 号进程运行,而是由系统服务管理器(如 systemd)启动,专注于应用级进程管理和恢复 。当被管理的子进程异常退出时,Supervisor 可以根据配置自动重启,以提升服务稳定性。
安装
Ubuntu / Debian
sudo apt update && sudo apt install supervisor -y
sudo systemctl enable supervisor
sudo systemctl start supervisor
安装完成后,可通过 sudo systemctl status supervisor
验证服务状态 。
CentOS / RHEL
sudo yum install epel-release -y
sudo yum install supervisor -y
sudo systemctl enable supervisord
sudo systemctl start supervisord
通过 sudo systemctl status supervisord
查看状态。
配置
Supervisor 的主配置文件通常位于 /etc/supervisor/supervisord.conf
,而单个程序的配置文件存放在 /etc/supervisor/conf.d/
目录中
主配置文件
Supervisor 的主配置文件通常位于 /etc/supervisor/supervisord.conf
,常用配置段如下:
段 | 参数 | 含义 |
---|---|---|
[supervisord] | nodaemon | 以非后台模式运行(调试用) |
logfile | 指定 Supervisor 自身日志文件 | |
loglevel | 日志级别(info、warn、debug) | |
[inet_http_server] | port | 开启 Web 界面端口(示例:*:9001) |
username | Web 界面用户名 | |
password | Web 界面访问密码 |
其中关键 [supervisord]
段如下:
[supervisord]
logfile=/var/log/supervisord.log
logfile_maxbytes=50MB
logfile_backups=10
loglevel=info
pidfile=/var/run/supervisord.pid
nodaemon=false
logfile
:Supervisor 主进程活动日志路径。logfile_maxbytes
:单个日志文件最大大小,超过后按顺序编号备份(如.1
,.2
),0
表示不限制大小,不轮转。logfile_backups
:保留的备份日志文件数量,0
表示不保留。
子进程日志
参数 | 含义 |
---|---|
command | 启动进程的命令,必须为绝对路径 |
process_name | 进程名称模板(可用于多进程管理) |
directory | 启动前切换的工作目录 |
user | 指定运行进程的用户 |
autostart | 是否随 Supervisor 启动自动启动(true/false) |
autorestart | 进程退出后是否自动重启(true/false/unexpected) |
stdout_logfile | 标准输出日志文件路径 |
stderr_logfile | 标准错误日志文件路径 |
startretries | 重试启动次数 |
stopsignal | 终止进程时发送的信号(如 TERM、KILL) |
在 [program:x]
段中,可配置子进程的标准输出/错误日志及轮转:
[program:myapp]
command=/usr/bin/python /opt/myapp/app.py
directory=/opt/myapp
user=appuser
autostart=true
autorestart=true
stdout_logfile=/var/log/myapp/out.log
stdout_logfile_maxbytes=20MB
stdout_logfile_backups=5
stderr_logfile=/var/log/myapp/err.log
stderr_logfile_maxbytes=20MB
stderr_logfile_backups=5
redirect_stderr=true
stdout_logfile_maxbytes
/stderr_logfile_maxbytes
:当日志文件大小超过该值时进行轮转。stdout_logfile_backups
/stderr_logfile_backups
:轮转后保留的备份数量
以上示例将一个 Python 应用作为 Supervisor 管理对象,该应用将在崩溃后自动重启并生成日志文件
注意:开启基于大小的轮转后,不可让多个进程写入同一日志文件,否则会导致日志损坏
Web 界面
编辑 /etc/supervisor/supervisord.conf
,在 [inet_http_server]
段中添加:
[inet_http_server]
port = *:9001
username = admin
password = secret
重启 Supervisor:
systemctl restart supervisor
然后在浏览器中访问 http://服务器IP:9001/
,输入用户名和密码,即可通过 Web 界面管理进程
常用操作
# 重读配置但不生效
supervisorctl reread
# 更新并应用新配置
supervisorctl update
# 启动/停止指定程序
supervisorctl start myapp
supervisorctl stop myapp
# 查看所有进程状态
supervisorctl status
# 实时查看日志
supervisorctl tail -f myapp
最佳实践
- 进程分组管理:使用
[group:name]
将相关程序归组,统一启动/停止。 - 事件监听:通过
[eventlistener:x]
在进程状态变化时触发自定义脚本。 - 日志监控:结合 ELK、Promtail 等工具对日志进行集中收集与分析。
- 权限控制:确保日志目录和配置文件权限正确,避免非授权用户读取/修改。
常见问题
- 轮转后日志继续写入旧文件?
确认是否使用copytruncate
,并在 logrotate 后向 supervisord 发送SIGUSR2
。 - 为什么子进程日志不轮转?
检查是否配置了stdout_logfile_maxbytes
和stdout_logfile_backups
,且未被其他配置覆盖。 - 如何将日志发送到 syslog?
在[supervisord]
段将logfile=syslog
,并移除轮转配置。
总结
本文从安装、配置到日志管理,系统讲解了 Supervisor 的核心功能与轮转策略,帮助你在生产环境中构建稳定、可靠的进程管理与日志系统。通过内置的大小轮转和结合 logrotate
的时间轮转,再配合 SIGUSR2
日志重开,可满足多样化的运维需求。更多细节可参考官方文档,不断优化,提升系统可用性与可维护性。