定义
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 完全使用该语言编写。
参考资料
- Introduction¶ [引用日期2026-10-14]
- Supervisor: A Process Control System [引用日期2026-10-14]
- supervisorctl.1.en [引用日期2026-10-14]
- 软件包:supervisor(4.3.0-2) [引用日期2026-10-14]
- Ubuntu Manpage: supervisord - supervisor_4.3.0-1_all [引用日期2026-10-14]
- supervisor [引用日期2026-10-14]
- pypi.org 上的网页 [引用日期2026-10-14]
- name: package [引用日期2026-10-14]
- title: Supervisor Process Manager Cheat Sheet [引用日期2026-10-14]