Supervisorctl 详解:Linux 进程管理利器完全指南
什么是 Supervisor?
Supervisor 是一个用 Python 编写的客户端/服务器系统,允许用户监控和控制类 UNIX 操作系统上的多个进程。它在 Linux 和 macOS 等系统上广泛使用,特别适合管理后台进程、守护进程等。
主要特性
- 进程监控:自动重启崩溃或异常退出的进程
- 集中管理:通过统一的接口管理多个进程
- 简单配置:使用 INI 风格的配置文件
- Web界面:提供可选的 Web 管理界面
- 事件通知:支持事件通知机制
安装 Supervisor
Ubuntu/Debian
sudo apt-get update
sudo apt-get install supervisor
CentOS/RHEL
sudo yum install supervisor
# 或者对于较新版本
sudo dnf install supervisor
使用 pip 安装
pip install supervisor
基础配置文件
主配置文件
Supervisor 的主配置文件通常位于:
/etc/supervisor/supervisord.conf(Ubuntu/Debian)/etc/supervisord.conf(CentOS/RHEL)
程序配置文件
程序配置可以放在:
/etc/supervisor/conf.d/目录下- 在主配置文件中通过
[include]节指定
编写程序配置
创建一个示例程序配置 /etc/supervisor/conf.d/myapp.conf:
[program:myapp]
; 程序名称
command=/usr/bin/python /path/to/your/app.py
; 运行命令
; 进程配置
directory=/path/to/your/app
; 工作目录
user=www-data
; 运行用户
autostart=true
; 是否自动启动
autorestart=true
; 是否自动重启
startretries=3
; 启动重试次数
; 日志配置
stdout_logfile=/var/log/supervisor/myapp.stdout.log
; 标准输出日志
stderr_logfile=/var/log/supervisor/myapp.stderr.log
; 错误输出日志
stdout_logfile_maxbytes=50MB
; 日志文件最大大小
stdout_logfile_backups=10
; 日志备份数量
; 环境变量
environment=PYTHONPATH="/path/to/your/app",HOME="/home/www-data"
Supervisorctl 常用命令详解
服务管理命令
# 启动 supervisor 服务
sudo service supervisor start
# 或者
sudo systemctl start supervisor
# 停止 supervisor 服务
sudo service supervisor stop
# 重启 supervisor 服务
sudo service supervisor restart
# 查看 supervisor 状态
sudo service supervisor status
进程管理命令
# 查看所有进程状态
sudo supervisorctl status
# 启动单个进程
sudo supervisorctl start myapp
# 停止单个进程
sudo supervisorctl stop myapp
# 重启单个进程
sudo supervisorctl restart myapp
# 启动所有进程
sudo supervisorctl start all
# 停止所有进程
sudo supervisorctl stop all
# 重启所有进程
sudo supervisorctl restart all
# 重新加载配置(不重启运行的进程)
sudo supervisorctl reload
# 重新读取配置并受影响的进程
sudo supervisorctl update
# 查看进程日志
sudo supervisorctl tail myapp
sudo supervisorctl tail -f myapp
sudo supervisorctl tail myapp stderr
高级命令
# 进入交互模式
sudo supervisorctl
# 在交互模式下执行命令
> status
> start myapp
> stop all
> exit
# 信号操作
sudo supervisorctl signal myapp STOP
sudo supervisorctl signal all KILL
# 清除进程日志
sudo supervisorctl clear myapp
实际应用示例
示例1:管理 Flask Web 应用
创建配置文件 /etc/supervisor/conf.d/flaskapp.conf:
[program:flaskapp]
command=/home/user/venv/bin/gunicorn -w 4 -b 0.0.0.0:8000 app:app
directory=/home/user/myflaskapp
user=user
autostart=true
autorestart=true
startretries=3
stdout_logfile=/var/log/supervisor/flaskapp.out.log
stderr_logfile=/var/log/supervisor/flaskapp.err.log
environment=FLASK_ENV="production",DATABASE_URL="postgresql://user:pass@localhost/db"
应用配置:
sudo supervisorctl reread
sudo supervisorctl update
sudo supervisorctl start flaskapp
示例2:管理 Celery Worker
[program:celeryworker]
command=/home/user/venv/bin/celery -A tasks worker --loglevel=info
directory=/home/user/myproject
user=user
numprocs=2
process_name=celeryworker-%(process_num)02d
autostart=true
autorestart=true
startretries=3
stdout_logfile=/var/log/supervisor/celeryworker.out.log
stderr_logfile=/var/log/supervisor/celeryworker.err.log
environment=C_FORCE_ROOT="true"
示例3:进程组管理
[program:webapp1]
command=/usr/bin/python webapp1.py
autostart=false
[program:webapp2]
command=/usr/bin/python webapp2.py
autostart=false
[group:webapps]
programs=webapp1,webapp2
管理进程组:
sudo supervisorctl start webapps:
sudo supervisorctl stop webapps:
sudo supervisorctl restart webapps:
故障排查技巧
查看详细状态
# 查看进程详细信息
sudo supervisorctl status myapp
# 跟踪日志
sudo supervisorctl tail -f myapp
sudo supervisorctl tail -f myapp stderr
# 查看主进程日志
sudo tail -f /var/log/supervisor/supervisord.log
常见问题解决
-
进程无法启动
# 检查命令是否正确 sudo supervisorctl start myapp # 查看错误日志 sudo supervisorctl tail myapp stderr -
配置不生效
# 重新读取配置 sudo supervisorctl reread sudo supervisorctl update -
进程意外退出
# 查看退出状态 sudo supervisorctl status # 检查退出码含义 sudo supervisorctl tail myapp
Web 管理界面
启用 Web 界面,在主配置文件中添加:
[inet_http_server]
port=0.0.0.0:9001
username=admin
password=your_password
访问 http://your-server:9001 即可通过 Web 界面管理进程。
最佳实践
-
权限管理
- 为每个服务创建专用用户
- 合理设置文件权限
-
日志管理
- 定期清理日志文件
- 使用 logrotate 管理日志
-
监控告警
- 配置进程监控告警
- 集成到现有监控系统
-
配置管理
- 使用版本控制管理配置文件
- 编写配置模板
1万+

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



