侧边栏壁纸
博主头像
学海无涯博主等级

有疑问可发邮件zp@wlzs.cn。

  • 累计撰写 330 篇文章
  • 累计创建 89 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

使用supervisor

利刃
2025-09-03 / 0 评论 / 0 点赞 / 3 阅读 / 5450 字
温馨提示:
本文最后更新于 2025-09-03,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

概述

Supervisor 是一个用 Python 编写的 进程控制系统,专为类 Unix 操作系统(如 Linux, macOS)设计。它的核心目的是监控和控制大量长时间运行的后台进程。

功能

  1. 进程守护与自动重启: 这是 Supervisor 最核心的功能。如果被管理的进程意外崩溃或退出,Supervisor 会自动将其重新启动,确保关键服务持续运行。
  2. 进程分组管理: 可以方便地启动、停止、重启一组相关的进程(例如一个 Web 应用及其后台任务队列)。
  3. 集中式进程管理: 提供一个统一的命令行 (supervisorctl) 和 Web 界面 (需要额外配置) 来查看所有被管理进程的状态(运行中、停止、失败等)并进行操作(启动、停止、重启、查看日志等)。
  4. 开机自动启动: 配置 Supervisor 在系统启动时自动运行,并由它来负责拉起所有配置好的进程,无需手动编写复杂的系统服务脚本 (systemd 或 init.d 脚本通常只需管理 Supervisor 本身)。
  5. 日志管理:
    • 捕获被管理进程的标准输出 (stdout) 和标准错误输出 (stderr)。
    • 可以配置日志文件的路径、大小限制和轮转策略。
    • 通过 supervisorctl tail 命令方便地查看实时日志。
  6. 权限控制: 可以配置不同进程以不同的系统用户身份运行,增强安全性。
  7. 事件通知: 可以配置在进程状态发生特定变化(如启动失败、退出次数过多、进入 FATAL 状态)时发送通知(例如邮件)。

应用场景

  • Web 应用服务器: 确保你的 Python (Gunicorn, uWSGI), PHP (PHP-FPM), Node.js (PM2 本身也是一种进程管理,但 Supervisor 可以管理 PM2 或其他 Node 应用) 等应用服务器进程在崩溃后自动恢复。
  • 后台任务/队列处理器: 管理 Celery (Python), Resque (Ruby), Beanstalkd workers 等后台任务处理进程。
  • 定时任务调度器: 确保类似 cron 替代品(但更健壮)的进程持续运行。
  • 自定义脚本/服务: 任何需要长时间运行、需要高可用性(自动重启)、需要集中管理的脚本或服务。
  • 微服务架构: 在单台服务器上管理多个相关的微服务进程。

安装

dnf install epel-release -y
dnf install supervisor -y

配置文件

Supervisor 主要有两类配置文件:

  1. 主配置文件 (supervisord.conf): 通常位于 /etc/supervisor/supervisord.conf/etc/supervisord.conf。它配置 Supervisor 守护进程 (supervisord) 本身的行为(日志、用户权限、包含其他配置文件的位置、Web UI 等)。
  2. 程序/进程配置文件 (*.conf): 通常存放在 /etc/supervisor/conf.d/ 目录下(这个路径在主配置文件中通过 [include] 部分指定)。每个文件通常对应一个(或一组相关的)需要被管理的进程。推荐一个进程一个配置文件,便于管理。
    典型进程配置文件
[program:my_awesome_app]  ; *必需* 程序唯一名称,用于 supervisorctl 操作。替换成你的应用名。
command=/path/to/your/app/start_script.sh  ; *必需* 要执行的命令。可以是绝对路径,或利用 PATH。就像在终端里运行一样。
; 例如 Python: command=/path/to/venv/bin/gunicorn myapp:app -c gunicorn_conf.py
; 例如 Node: command=/usr/bin/node /path/to/your/app.js
; 例如 PHP: command=/usr/bin/php /path/to/your/worker.php

directory=/path/to/your/app/working/dir  ; *强烈推荐* 命令在执行前会切换到这个目录。对于依赖相对路径的应用很重要。
user=your_username  ; *推荐* 以哪个用户身份运行此进程。避免使用 root,增强安全性。
autostart=true      ; *常用* 是否在 supervisord 启动时自动启动此程序 (true/false)。通常设为 true。
autorestart=true    ; *常用* 程序退出时是否自动重启。true(总是重启) / unexpected(仅在非预期退出码时重启) / false(不自动重启)。通常用 true 或 unexpected。
startsecs=10        ; 程序启动后持续运行多少秒才被认为是启动成功(进入 RUNNING 状态)。根据应用启动时间调整。
startretries=3      ; 启动失败后自动重试的次数,超过次数后状态变为 FATAL。
stopsignal=TERM     ; 停止进程时发送的信号 (TERM, INT, KILL, QUIT 等)。默认为 TERM。如果进程无法正常停止,可能需要用 KILL。
stopwaitsecs=10     ; 发送 stopsignal 后等待多少秒,如果进程还没结束就发送 SIGKILL 强制结束。
stopasgroup=true    ; 是否向整个进程组发送停止信号。通常和下面 killasgroup 一起设为 true,确保子进程也被停止。
killasgroup=true    ; 是否向整个进程组发送 SIGKILL 信号。通常和 stopasgroup 一起设为 true。
environment=        ; 设置环境变量。格式: KEY="value",KEY2="value2"。例如 PATH="/extra/path:%(ENV_PATH)s"
; environment=PYTHONPATH="/my/custom/path",PORT="8000"

; 日志配置 - *非常重要*
stdout_logfile=/var/log/supervisor/my_awesome_app.log  ; 标准输出日志路径。确保目录存在且有写权限!
stdout_logfile_maxbytes=50MB   ; 单个日志文件最大大小 (支持 KB, MB, GB)
stdout_logfile_backups=10       ; 保留多少个备份日志文件 (轮转)
stdout_capture_maxbytes=0       ; 一般设为0,禁用进程通信的特殊处理
stdout_events_enabled=false     ; 一般设为 false

; 配置错误日志 (stderr),配置项同上
stderr_logfile=/var/log/supervisor/my_awesome_app.err  ; 错误输出日志路径
stderr_logfile_maxbytes=50MB
stderr_logfile_backups=10
stderr_capture_maxbytes=0
stderr_events_enabled=false

; 如果想把 stdout 和 stderr 合并到一个日志文件,可以设置:
; redirect_stderr=true ; 将 stderr 重定向到 stdout
; 然后只配置 stdout_logfile 即可

; 高级配置 (按需使用)
; priority=999           ; 启动/停止的优先级 (数字越小越优先)。影响 autostart 顺序。
; numprocs=1             ; 启动多少个此程序的实例。>1 时,程序名会变成 [program:name]_0, [program:name]_1 ...
; process_name=%(program_name)s_%(process_num)02d ; 与 numprocs 配合使用,定义进程名格式。

核心配置

  • [program:your_app_name]
  • command= (程序的完整启动命令)
  • directory= (工作目录)
  • user= (运行用户)
  • autostart=true
  • autorestart=true (或 unexpected)

启动

启动服务

systemctl start supervisord
systemctl enable supervisord

启动应用

supervisorctl update  # 读取新的或修改过的程序配置
supervisorctl status                # 查看所有程序状态
supervisorctl start your_app_name   # 启动指定程序
supervisorctl stop your_app_name    # 停止指定程序
supervisorctl restart your_app_name # 重启指定程序
supervisorctl tail your_app_name     # 查看程序的标准输出日志
supervisorctl tail -f your_app_name  # 实时跟踪标准输出日志
supervisorctl tail your_app_name stderr # 查看错误日志
supervisorctl reread                 # 重读所有配置文件 (在修改了配置文件但不想 update 启动时常用)
supervisorctl reload                 # 重启 supervisord 并重新加载所有配置 (更彻底)
0
  1. 支付宝打赏

    qrcode alipay
  2. 微信打赏

    qrcode weixin

评论区