Supervisor详解:Linux进程管理的终极利器

Supervisor是一个用Python开发的进程管理工具,能够将普通命令行进程转变为后台守护进程,并监控进程状态,在异常退出时自动重启。

一、Supervisor核心特性

Supervisor具有以下显著特点:

  1. 简单易用:通过简单的INI风格配置文件进行配置,支持自动重启失败进程和自动日志轮换
  2. 集中管理:提供统一界面管理多个进程,支持本地/远程命令和Web界面控制
  3. 高效稳定:采用fork/exec机制启动子进程,操作系统会立即向Supervisor发送进程终止信号
  4. 可扩展性:提供事件通知协议和XML-RPC接口,Python开发者可轻松扩展功能
  5. 跨平台:支持大多数类Unix系统(Linux、Mac OS X、Solaris、FreeBSD等)

二、Supervisor核心组件

Supervisor系统由以下几个核心组件构成:

  1. supervisord:服务端主进程,负责启动子进程、响应客户端命令、记录日志等
  2. supervisorctl:命令行客户端,提供类似shell的接口管理进程
  3. Web界面:通过配置inet_http_server后,可通过浏览器访问管理界面
  4. XML-RPC接口:为Web UI提供服务的同一HTTP服务器提供的编程接口

三、安装Supervisor

Supervisor可通过多种方式安装:

基于Debian/Ubuntu系统

sudo apt-get update
sudo apt-get install supervisor

基于RPM的系统(CentOS/Fedora)

sudo yum install supervisor
# 或
sudo dnf install supervisor

使用pip安装

pip install supervisor

安装完成后,系统会生成以下关键文件:

  • /etc/supervisord.conf:主配置文件
  • /etc/supervisord.d/:子配置文件目录
  • /usr/bin/supervisord:服务端程序
  • /usr/bin/supervisorctl:客户端程序

四、配置详解

主配置文件

生成默认配置文件模板:

echo_supervisord_conf > /etc/supervisord.conf

主配置文件主要包含以下部分:

[unix_http_server]
file=/tmp/supervisor.sock   ; UNIX socket文件路径
chmod=0700                 ; socket文件权限

[inet_http_server]         ; Web管理界面配置
port=127.0.0.1:9001       ; 监听IP和端口
username=user             ; 登录用户名
password=123              ; 登录密码

[supervisord]

logfile=/tmp/supervisord.log ; 日志文件路径 logfile_maxbytes=50MB ; 日志文件最大大小 logfile_backups=10 ; 保留的日志备份数量 loglevel=info ; 日志级别 pidfile=/tmp/supervisord.pid ; PID文件路径 nodaemon=false ; 是否以守护进程方式运行

[supervisorctl]

serverurl=unix:///tmp/supervisor.sock ; 连接supervisord的URL

[include]

files = supervisord.d/*.conf ; 包含的子配置文件

程序配置

/etc/supervisord.d/目录下为每个程序创建单独的配置文件,例如myapp.conf

[program:myapp]
command=/path/to/your/program ; 要执行的命令
directory=/path/to/working/directory ; 工作目录
user=myuser                  ; 运行用户
autostart=true               ; 是否自动启动
autorestart=true             ; 是否自动重启
stderr_logfile=/var/log/myapp.err.log ; 错误日志
stdout_logfile=/var/log/myapp.out.log ; 输出日志
startsecs=10                 ; 启动后稳定运行时间
startretries=3               ; 启动失败重试次数
environment=KEY="value"      ; 环境变量

五、常用操作命令

  1. 启动supervisord服务
supervisord -c /etc/supervisord.conf
  1. 重新加载配置
supervisorctl reread
supervisorctl update
  1. 管理单个程序
supervisorctl start myapp    # 启动
supervisorctl stop myapp     # 停止
supervisorctl restart myapp  # 重启
supervisorctl status myapp   # 查看状态
  1. 管理所有程序
supervisorctl start all
supervisorctl stop all
supervisorctl restart all
  1. 查看日志
tail -f /var/log/myapp.out.log

六、高级功能

进程组管理

Supervisor支持将相关程序分组管理:

[group:apps]
programs=app1,app2,app3

[program:app1]

command=/usr/bin/python3 app1.py

[program:app2]

command=/usr/bin/python3 app2.py

[program:app3]

command=/usr/bin/python3 app3.py

操作整个组:

supervisorctl start apps:*
supervisorctl stop apps:*

日志轮转

配置日志自动轮转:

[program:myapp]
stdout_logfile=/var/log/myapp.log
stdout_logfile_maxbytes=50MB  ; 日志文件最大大小
stdout_logfile_backups=10     ; 保留的备份数量

监控报警

配置eventlistener实现异常报警:

[eventlistener:crash_alert]
command=python3 alert.py
events=PROCESS_STATE_EXITED

alert.py示例:

import sys
import requests

def alert(msg):
    # 发送报警通知
    url = "https://your-webhook-url"
    requests.post(url, json={"text": msg})

while True:
    headers = sys.stdin.readline()
    payload = sys.stdin.readline()
    sys.stdout.write("READY\n")
    sys.stdout.flush()
    if "PROCESS_STATE_EXITED" in payload:
        alert("程序挂了!!!")

Docker容器中使用

在Docker容器中管理多个服务:

FROM php:7.4.33-fpm
RUN apt-get update && apt-get install -y supervisor nginx cron
COPY supervisord.conf /etc/supervisor/conf.d/
CMD ["/usr/bin/supervisord", "-c", "/etc/supervisor/supervisord.conf"]

supervisord.conf示例:

[supervisord]
nodaemon=true  ; 容器中需要前台运行

[program:php-fpm]

command=php-fpm autostart=true autorestart=true

[program:nginx]

command=nginx -g ‘daemon off;’ autostart=true autorestart=true

[program:cron]

command=cron -f ; cron需要-f参数保持前台运行 autostart=true autorestart=true

七、常见问题解决

  1. 程序无法自动重启:检查autorestart配置是否为true
  2. 权限问题:确保运行用户有执行程序的权限
  3. 日志文件不生成:检查日志文件路径是否有写入权限
  4. 配置修改不生效:修改配置后需要执行supervisorctl update
  5. Web界面无法访问:检查[inet_http_server]配置和防火墙设置

八、总结

Supervisor作为一款强大的进程管理工具,具有配置简单、功能全面、稳定性高等特点,特别适合管理生产环境中的关键服务进程。合理使用Supervisor可以显著提高服务的稳定性和可靠性,减少运维工作量。

滚动至顶部