Supervisor 进程管理详解
一、什么是 Supervisor
Supervisor 是一个用 Python 编写的进程管理工具,它可以帮助你监控和控制 Linux 系统上的进程。主要功能包括:
- 自动启动进程
- 进程崩溃时自动重启
- 集中管理多个进程
- 提供命令行和 Web 界面管理进程
- 支持进程组管理
- 支持事件监听和处理
二、安装 Supervisor
1. 使用 pip 安装
1 2 3 4 5 6 7 8
| pip install supervisor
echo_supervisord_conf
echo_supervisord_conf > /etc/supervisord.conf
|
2. 使用包管理器安装
Ubuntu/Debian:
1 2
| apt-get update apt-get install supervisor
|
CentOS/RHEL:
1 2
| yum install epel-release yum install supervisor
|
Arch Linux:
三、配置 Supervisor
1. 主配置文件
Supervisor 的主配置文件默认为 /etc/supervisord.conf,包含以下主要部分:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
| [unix_http_server] file=/var/run/supervisor/supervisor.sock
[inet_http_server] port=0.0.0.0:9001 username=user password=123
[supervisord] logfile=/var/log/supervisor/supervisord.log logfile_maxbytes=50MB logfile_backups=10 loglevel=info pidfile=/var/run/supervisord.pid nodaemon=false minfds=1024 minprocs=200
[rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl] serverurl=unix:///var/run/supervisor/supervisor.sock
[include] files = /etc/supervisor/conf.d/*.conf
|
2. 程序配置文件
为了更好地组织配置,建议为每个程序创建单独的配置文件,放在 /etc/supervisor/conf.d/ 目录下:
示例:/etc/supervisor/conf.d/nginx.conf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| [program:nginx] command=/usr/sbin/nginx -g "daemon off;" process_name=%(program_name)s numprocs=1 directory=/usr/share/nginx/html umask=022 priority=999 autostart=true autorestart=true startsecs=10 startretries=3 exitcodes=0,2 stopsignal=QUIT stopwaitsecs=10 user=root redirect_stderr=true stdout_logfile=/var/log/supervisor/nginx.log stdout_logfile_maxbytes=1MB stdout_logfile_backups=10
|
3. 进程组配置
可以将相关进程组织成组,方便管理:
1 2 3
| [group:web] programs=nginx,php-fpm priority=999
|
四、使用 supervisorctl 管理进程
1. 基本命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| supervisorctl start program_name supervisorctl stop program_name supervisorctl restart program_name
supervisorctl start group_name: supervisorctl stop group_name: supervisorctl restart group_name:
supervisorctl start all supervisorctl stop all supervisorctl restart all
supervisorctl status
supervisorctl reload supervisorctl update
supervisorctl
|
2. 交互式管理
1 2 3 4 5 6 7 8 9 10 11
| $ supervisorctl nginx RUNNING pid 12345, uptime 1:23:45 php-fpm RUNNING pid 12346, uptime 1:23:45 supervisor> status nginx RUNNING pid 12345, uptime 1:23:45 php-fpm RUNNING pid 12346, uptime 1:23:45 supervisor> stop nginx nginx: stopped supervisor> start nginx nginx: started supervisor> exit
|
五、Web 界面管理
如果在配置中启用了 inet_http_server,可以通过浏览器访问 http://your-server:9001 来管理进程。
六、事件监听
Supervisor 支持事件监听,可以对进程状态变化做出响应:
1 2 3 4 5 6
| [eventlistener:process_monitor] command=/path/to/monitor_script.sh events=PROCESS_STATE_CHANGED buffer_size=10 autostart=true autorestart=true
|
示例事件处理脚本:
1 2 3 4 5 6 7 8 9 10 11 12
| #!/bin/bash
while read line; do echo "Event: $line" case "$line" in *PROCESS_STATE_EXITED*) echo "Process exited" ;; esac done
|
七、与 systemd 集成
1. 创建 systemd 服务文件
/etc/systemd/system/supervisord.service:
1 2 3 4 5 6 7 8 9 10 11 12 13
| [Unit] Description=Supervisor process control system After=network.target
[Service] Type=forking ExecStart=/usr/bin/supervisord -c /etc/supervisord.conf ExecStop=/usr/bin/supervisorctl shutdown ExecReload=/usr/bin/supervisorctl reload Restart=on-failure
[Install] WantedBy=multi-user.target
|
2. 启用并启动服务
1 2 3 4
| systemctl daemon-reload systemctl enable supervisord.service systemctl start supervisord.service systemctl status supervisord.service
|
八、最佳实践
配置文件组织:
- 使用主配置文件包含其他配置
- 为每个服务创建单独的配置文件
- 使用进程组管理相关服务
日志管理:
- 为每个进程设置独立的日志文件
- 合理设置日志轮转
- 考虑使用日志聚合工具(如 ELK)
安全性:
- 为 Web 界面设置强密码
- 限制 Web 界面访问 IP
- 以非 root 用户运行进程
性能优化:
- 合理设置
minfds 和 minprocs
- 避免监控过多进程
- 调整
startsecs 和 stopwaitsecs
故障恢复:
- 设置合理的
autorestart 策略
- 配置事件监听器处理异常
- 定期备份配置文件
九、常见问题及解决方案
1. 进程启动失败
1 2 3 4 5 6 7 8
| tail -f /var/log/supervisor/supervisord.log
supervisorctl status program_name
exec /path/to/command
|
2. 配置文件不生效
1 2 3 4 5
| supervisorctl reload
supervisord -c /etc/supervisord.conf -n -d
|
3. 权限问题
1 2 3 4 5
| chmod 0700 /var/run/supervisor/supervisor.sock
chown -R supervisor:supervisor /var/log/supervisor/
|
4. 进程无法自动重启
十、实例演示
示例 1:管理 Node.js 应用
配置文件 /etc/supervisor/conf.d/node-app.conf:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| [program:node-app] command=/usr/bin/node /path/to/app.js process_name=%(program_name)s numprocs=1 directory=/path/to/app autostart=true autorestart=true startsecs=5 startretries=3 exitcodes=0,1 stopsignal=INT stopwaitsecs=10 user=nodeuser redirect_stderr=true stdout_logfile=/var/log/supervisor/node-app.log stdout_logfile_maxbytes=1MB stdout_logfile_backups=10 environment=NODE_ENV=production,PORT=3000
|
启动服务:
1 2 3
| supervisorctl update supervisorctl start node-app supervisorctl status node-app
|
示例 2:管理 Python 应用
配置文件 /etc/supervisor/conf.d/flask-app.conf:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| [program:flask-app] command=/path/to/venv/bin/gunicorn -w 4 -b 0.0.0.0:8000 app:app process_name=%(program_name)s numprocs=1 directory=/path/to/flask-app autostart=true autorestart=true startsecs=5 startretries=3 exitcodes=0,2 stopsignal=TERM stopwaitsecs=10 user=flaskuser redirect_stderr=true stdout_logfile=/var/log/supervisor/flask-app.log stdout_logfile_maxbytes=1MB stdout_logfile_backups=10 environment=FLASK_ENV=production
|
启动服务:
1 2 3
| supervisorctl update supervisorctl start flask-app supervisorctl status flask-app
|
十一、总结
Supervisor 是一个强大的进程管理工具,它可以帮助你更有效地管理 Linux 系统上的进程。通过本文的介绍,你应该已经掌握了 Supervisor 的安装、配置、使用和故障排除方法。
在实际使用中,你可以根据具体需求配置 Supervisor,使其成为你系统管理的得力助手。记住,合理的配置和定期的维护是确保 Supervisor 正常运行的关键。
参考资料
- Supervisor 官方文档
- Supervisor 配置详解
- Supervisor 实战指南