Supervisor 进程管理详解

一、什么是 Supervisor

Supervisor 是一个用 Python 编写的进程管理工具,它可以帮助你监控和控制 Linux 系统上的进程。主要功能包括:

  • 自动启动进程
  • 进程崩溃时自动重启
  • 集中管理多个进程
  • 提供命令行和 Web 界面管理进程
  • 支持进程组管理
  • 支持事件监听和处理

二、安装 Supervisor

1. 使用 pip 安装

1
2
3
4
5
6
7
8
# 安装 Supervisor
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

1
pacman -S supervisor

三、配置 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 ; socket 路径

[inet_http_server] ; 启用 Web 界面
port=0.0.0.0:9001 ; 监听的 IP 及端口
username=user ; 用户名
password=123 ; 密码

[supervisord]
logfile=/var/log/supervisor/supervisord.log ; 日志路径
logfile_maxbytes=50MB ; 单个日志文件最大大小
logfile_backups=10 ; 保留日志文件数量
loglevel=info ; 日志级别
pidfile=/var/run/supervisord.pid ; 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 ; 连接 socket

[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 ; 随 supervisord 启动
autorestart=true ; 自动重启
startsecs=10 ; 启动后等待时间
startretries=3 ; 启动失败重试次数
exitcodes=0,2 ; 预期退出码
stopsignal=QUIT ; 停止信号
stopwaitsecs=10 ; 停止等待时间
user=root ; 运行用户
redirect_stderr=true ; 重定向 stderr 到 stdout
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

八、最佳实践

  1. 配置文件组织

    • 使用主配置文件包含其他配置
    • 为每个服务创建单独的配置文件
    • 使用进程组管理相关服务
  2. 日志管理

    • 为每个进程设置独立的日志文件
    • 合理设置日志轮转
    • 考虑使用日志聚合工具(如 ELK)
  3. 安全性

    • 为 Web 界面设置强密码
    • 限制 Web 界面访问 IP
    • 以非 root 用户运行进程
  4. 性能优化

    • 合理设置 minfdsminprocs
    • 避免监控过多进程
    • 调整 startsecsstopwaitsecs
  5. 故障恢复

    • 设置合理的 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
# 检查 socket 文件权限
chmod 0700 /var/run/supervisor/supervisor.sock

# 检查日志目录权限
chown -R supervisor:supervisor /var/log/supervisor/

4. 进程无法自动重启

1
2
3
# 检查 autorestart 设置
# 确保 exitcodes 设置正确
# 检查进程是否正常退出

十、实例演示

示例 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 正常运行的关键。

参考资料

  1. Supervisor 官方文档
  2. Supervisor 配置详解
  3. Supervisor 实战指南