介绍

概述

Supervisor 是客户端/服务器系统,允许用户在类 UNIX 操作系统上控制多个进程。它的灵感来源于以下几点:

便利

通常需要写 rc.d 脚本用于每个单个流程实例是不方便的。rc.d 脚本是进程初始化/自动启动/管理的一种极好的最低公分母形式,但它们的编写和维护可能非常痛苦。此外,rc.d 脚本不能自动重新启动崩溃的进程,许多程序在崩溃时不能正确地重新启动自己。supervisor 将进程作为它的子进程启动,可以配置为在崩溃时自动重启它们。它还可以被自动配置为在自己调用时启动进程。

精度

在 UNIX 上准确地获取进程的 up/down 状态通常是很困难的。pidfile 经常说谎。supervise 以子进程的形式启动进程,因此它总是知道子进程的真实 up/down 状态,并且可以方便地查询这些数据。

Delegation

需要控制进程状态的用户通常只需要这样做。他们不希望或不需要对运行进程的机器进行完整的 shell 访问。监听 “low” TCP 端口的进程通常需要作为根用户启动并重新启动(UNIX 的一个错误特性)。通常情况下,允许 “normal” 用户停止或重新启动这样的进程是完全没问题的,但为他们提供 shell 访问权限通常是不切实际的,而为他们提供根访问权限或 sudo 访问权限通常是不可能的。向他们解释这个问题的存在也是很困难的。如果 supervisor 以 root 用户的身份启动,就可以允许“普通”用户控制这些进程,而不需要向他们解释问题的复杂性。Supervisorctl 允许对机器进行非常有限的访问,本质上允许用户通过从简单的 shell 或 web UI 中发出 “stop”、“start” 和 “restart” 命令来查看进程状态和控制受监控的子进程。

进程组

进程通常需要按组启动和停止,有时甚至需要按“优先顺序”。通常很难向人们解释如何做到这一点。Supervisor 允许你给进程分配优先级,并允许用户通过 supervisorctl 客户端发出命令,比如 “start all” 和 “restart all”,它们按照预先分配的优先级顺序启动它们。此外,进程可以被分组为“进程组”,一组逻辑上相关的进程可以作为一个单元停止和启动。

特性

简单

Supervisor 通过简单的 ini 风格的配置文件进行配置,很容易学习。它为每个进程提供了许多选项,让您的生活更轻松,比如重新启动失败的进程和自动日志旋转。

集中

Supervisor 为您提供一个启动、停止和监视流程的地方。进程可以单独控制,也可以分组控制。您可以配置 Supervisor 提供本地或远程命令行和 web 界面。

高效

“Supervisor 通过 fork/exec 启动子进程,子进程不会守护。当一个进程终止时,操作系统会立即向 Supervisor 发出信号,而不是像某些解决方案那样依赖于麻烦的 PID 文件和周期性轮询来重启失败的进程。

可扩展

“Supervisor 有简单的事件通知协议,用任何语言编写的程序都可以用来监视它,还有一个用于控制的 XML-RPC 接口。它还使用扩展点构建,可以被 Python 开发人员利用。

兼容

“Supervisor 几乎可以处理除 Windows 之外的所有东西。它在 Linux、Mac OS X、Solaris 和 FreeBSD 上得到了测试和支持。它完全是用 Python 编写的,所以安装不需要 C 编译器。

证明

虽然 Supervisor 在今天的开发非常活跃,但它并不是一款新软件。Supervisor 已经存在多年,已经在许多服务器上使用。

Supervisor 组件

supervisord

supervisor 的服务器端名为 supervisord。它负责在自己的调用中启动子程序,响应来自客户端的命令,重新启动崩溃或退出的子进程,记录子进程的 stdoutstderr 输出,并生成和处理子进程生命周期中相应点的事件。

服务器进程使用一个配置文件。它通常位于 /etc/supervisor .conf 中。这个配置文件是一个 “Windows-INI” 风格的配置文件。通过适当的文件系统权限来保证这个文件的安全是很重要的,因为它可能包含未加密的用户名和密码。

supervisorctl

supervisor 的客户端命令行名为 supervisorctl。它为 supervisord 提供了类似 shell 的接口。从 supervisorctl 中,用户可以连接到不同的 supervisord 进程(一次一个),获取被 supervisord 进程控制的子进程的状态,停止和启动子进程,获取 supervisord 进程的运行列表。

命令行客户端通过 UNIX 域套接字或 internet (TCP)套接字与服务器进行对话。服务器可以断言客户端的用户在执行命令之前应该提供身份验证凭据。客户端进程通常使用与服务器相同的配置文件,但任何包含 [supervisorctl] 部分的配置文件都可以工作。

Web 服务器

(稀疏的)web 用户界面的功能类似 supervisorctl 可以通过浏览器访问,如果你针对一个互联网插座启动 supervisord。访问服务器 URL(例如:在激活配置文件的 [inet_http_server] 部分后,通过 web 界面查看和控制进程状态。

XML-RPC 接口

服务于 web UI 的 HTTP 服务器也提供了 XML-RPC 接口,可以用来询问和控制管理器及其运行的程序。参考 XML-RPC API Documentation

平台需求

Supervisor 已经经过测试,已知运行在 Linux (Ubuntu 18.04), Mac OS X (10.4/10.5/10.6), Solaris (10 for Intel)和FreeBSD 6.1。它可能在大多数 UNIX 系统上运行良好。

在任何版本的 Windows 下,Supervisor 都不会运行。

Supervisor 将用于 Python 3 3.4 或更高版本以及 Python 2 2.7 版本。