Supervisor

关注
义项:进程管理工具
Supervisor

Supervisor 是一套用于类 UNIX 操作系统的客户端/服务器架构进程控制程序,由服务端 supervisord 与命令行客户端 supervisorctl 两个主要部分组成。[1] 它把被管理的程序作为自己的子进程启动,从而准确掌握子进程的运行状态,并在子进程异常退出时按配置自动重启,常被用来托管 Web 服务、队列消费者等长期运行的后台程序。[2] 该软件完全用 Python 编写,安装时不需要 C 编译器。[1]

百科 图文
目录
  1. 定义
  2. 原理
  3. 发展历程
  4. 应用
  5. 局限
  6. 参见

定义

Supervisor 是一个客户端/服务器(client/server)形式的进程控制系统,用于在类 UNIX 操作系统上监控和管理一批进程。[1] 它的服务端程序名为 supervisord,负责按配置文件启动子程序、响应客户端指令、重启崩溃或退出的子进程,并记录子进程的标准输出与标准错误;客户端程序名为 supervisorctl,通过与服务端通信提供类似 shell 的交互界面。[3]

在 Debian 等发行版中,它被描述为用于控制和维持进程状态的系统,作用与 init 类似,但并不打算取代 init。[4] 官方文档也说明,它与 launchd、daemontools、runit 等程序有部分共同目标,但不作为「进程号为 1」的 init 替代品,而是用来管理某个项目或某个客户相关的进程,并像普通程序一样在系统启动时拉起。[2]

原理

supervisord 启动被管理程序的方式是创建子进程,它与每个被托管的进程之间构成父子关系,因而在其整个生命周期内都能掌握真实的存活状态。[5] 子进程退出时,操作系统通过 SIGCHLD 信号通知 supervisord,后者据此执行相应的处理动作,这与依赖 PID 文件加周期性轮询的方案不同。[1]

被托管的程序需要以前台方式运行,不应自行转入后台或脱离终端,否则会被视为启动失败。[5] 子进程由 fork/exec 创建,配置通过 INI 风格的配置文件完成,例如 /etc/supervisord.conf,其中用 [program:x] 段落声明一个被管理程序及其启动命令、工作目录、运行用户、自动重启和日志等选项。[1]

supervisord 还提供 XML-RPC 接口用于控制,以及面向任意语言程序的事件通知协议;客户端可以经由 UNIX 域套接字或 TCP 套接字与服务端通信,并要求提供认证凭据。[3] 进程可以按优先级启动,也可以组成进程组被整体停止和启动。[1]

发展历程

Supervisor 项目由来已久,并非新出现的软件,在很长时间内已被大量服务器使用,同时仍在持续开发。[1] 其维护仓库位于 GitHub,支持 Python 3.4 及以上版本以及 Python 2.7。[6]

从版本记录看,3.0 版本发布于 2013 年 7 月 30 日,3.3.0 版本发布于 2016 年 5 月 14 日,4.0.0 系列随后推出并在 4.0.1、4.0.2、4.0.3、4.0.4 等版本中集中修复了 Python 2 与 Python 3 兼容性相关的问题;4.1.0 于 2019 年 10 月 19 日发布,4.2.0 于 2020 年 4 月 30 日发布。[7] Debian 软件仓库中收录的版本为 4.3.0-2,其依赖包括 Python 3。[4]

应用

Supervisor 用于托管需要长期运行并保持存活状态的后台程序。官方手册给出了 Apache、PostgreSQL、OpenLDAP 的 slapd、Zope 与 ZEO 等程序的前台启动配置示例,用于说明如何把各类服务纳入统一管理。[5]

在部署环境中,常见用法是通过 [program:x] 段落声明进程,配合 autorestart、startretries、stopasgroup、killasgroup 等选项控制重启行为和信号传递,并将标准输出与标准错误分别写入日志文件。[8] 修改配置后需要先执行 reread 检测变更、再执行 update 应用变更,仅重启进程不会重新读取配置文件。[9]

由于客户端只需发送停止、启动、重启等命令即可查看状态并操作受管子进程,普通用户能够在不必获得完整 shell 或 root 权限的前提下控制那些通常需要特权启动的进程。[1] 除命令行界面外,也可以将其配置为提供本地或远程的 Web 界面。[1]

局限

Supervisor 无法在 Windows 上运行。官方说明其已测试并支持 Linux、Mac OS X、Solaris 与 FreeBSD,并指出在任何 Windows 版本下都不能运行。[6]

它并不承担 init 系统的职责,不用于替代以「进程号 1」运行的初始化程序,只适合管理项目或客户相关的进程。[2] 被管理程序必须以前台方式运行,会自行 daemon 化或脱离终端的程序不适合直接交给它托管。[5] 此外,其 inet_http_server 默认不使用认证,官方文档在 4.0.4 版本中以安全公告的形式提示了这一点,并明确该服务默认并未启用。[7]

参见

  • supervisorctl —— Supervisor 的命令行客户端,用于查看状态并控制受管子进程。

  • supervisord —— Supervisor 的服务端程序,负责创建、监控与重启子进程。

  • init —— 类 UNIX 系统的初始化程序,Supervisor 强调自己并非其替代品。

  • daemontools —— 目标相近的进程控制系统,由 D. J. Bernstein 编写。

  • launchd —— 苹果在 Mac OS X 中作为进程 1 使用的进程控制系统。

  • Python —— Supervisor 完全使用该语言编写。

参考资料

  1. Introduction¶ [引用日期2026-10-14]
  2. Supervisor: A Process Control System [引用日期2026-10-14]
  3. supervisorctl.1.en [引用日期2026-10-14]
  4. 软件包:supervisor(4.3.0-2) [引用日期2026-10-14]
  5. Ubuntu Manpage: supervisord - supervisor_4.3.0-1_all [引用日期2026-10-14]
  6. supervisor [引用日期2026-10-14]
  7. pypi.org 上的网页 [引用日期2026-10-14]
  8. name: package [引用日期2026-10-14]
  9. title: Supervisor Process Manager Cheat Sheet [引用日期2026-10-14]
词条评价
词条统计

浏览次数:2 次

阅读量:0 次 · 阅读完成量:0 次

最近更新:2026-10-13T22:16:49Z

历史版本

本条目引用的词条
supervisorctl supervisord init daemontools launchd Python