Skip to main content

子过程

supervisord 的主要目的是基于其配置文件中的数据创建和管理进程。它通过创建子进程来实现。由supervisor生成的每个子进程由supervisord(supervisord 是其创建的每个进程的父进程)的整个生命周期进行管理。当孩子死亡时,通过 SIGCHLD 信号通知管理员其死亡,并且它执行适当的操作。

子进程的本地化

希望在supervisor下运行的程序不应该自我守护。相反,它们应该在前台运行。它们不应从启动的终端分离。

告诉程序是否在前台运行的最简单的方法是运行从shell提示符调用程序的命令。如果它让你控制终端回来,但继续运行,它是守护进程本身,这几乎肯定是错误的方式来运行它在supervisor下。您想要运行一个命令,本质上要求您按 Ctrl-C 以获得终端的控制权。如果它在运行后给你一个shell提示,而不需要按 Ctrl-C,它在supervisor下没有用。所有程序都有可以在前台运行的选项,但没有“标准方法”您需要阅读每个程序的文档。

以下是已知在Supervisor下以“前台”模式启动公共程序的配置文件示例。

程序配置示例

下面是一些“真实世界”程序配置示例:

Apache 2.2.6

[program:apache2]
command=/path/to/httpd -c "ErrorLog /dev/stdout" -DFOREGROUND
redirect_stderr=true

两个Zope 2.X实例和一个ZEO服务器

[program:zeo]
command=/path/to/runzeo
priority=1

[program:zope1]
command=/path/to/instance/home/bin/runzope
priority=2
redirect_stderr=true

[program:zope2]
command=/path/to/another/instance/home/bin/runzope
priority=2
redirect_stderr=true

Postgres 8.X

[program:postgres]
command=/path/to/postmaster
; we use the "fast" shutdown signal SIGINT
stopsignal=INT
redirect_stderr=true

OpenLDAP slapd

[program:slapd]
command=/path/to/slapd -f /path/to/slapd.conf -h ldap://0.0.0.0:8888
redirect_stderr=true

其他示例

可以用于在 supervisord 下启动服务的shell脚本的其他示例可以在 http://thedjbway.b0llix.net/services.html 找到。这些例子实际上是为 daemontools,但前提是相同的supervisor。

另一个用于在前台启动各种程序的配方集合可从 http://smarden.org/runit/runscripts.html 获得。

pidproxy 计划

一些进程(如 mysqld)忽略发送到由 supervisord 产生的实际进程的信号。相反,通过负责处理信号的这些类型的程序来创建“特殊”线程/过程。这是有问题的,因为 supervisord 只能杀死它自己创建的进程。如果 supervisord 创建的进程创建自己的子进程,supervisord 不能杀死它们。

幸运的是,这些类型的程序通常写一个“pidfile”,其中包含“特殊”进程的PID,并且意味着被读取和使用为了杀死进程。作为这种情况的解决方法,特殊的 pidproxy 程序可以处理这些类型的进程的启动。 pidproxy 程序是一个小垫片,启动一个过程,并在接收到信号后,将信号发送到pidfile中提供的pid。下面提供了启用pidproxy的程序的示例配置程序条目。

[program:mysql]
command=/path/to/pidproxy /path/to/pidfile /path/to/mysqld_safe

当安装管理程序(它是一个“控制台脚本”)时,pidproxy 程序被放入您的配置的 $BINDIR 中。

子过程环境

子进程将继承用于启动 supervisord 程序的shell的环境。在孩子的环境中,supervisord 本身也将设置几个环境变量,包括 SUPERVISOR_ENABLED (指示进程在管理程序控制下的标志),SUPERVISOR_PROCESS_NAME (该进程的配置文件指定的进程名称)和 SUPERVISOR_GROUP_NAME (配置文件 - 子进程的指定进程组名称)。

这些环境变量可以在名为 environment[supervisord] 段配置选项(适用于所有子进程)或每个 [program:x]environment 配置选项(仅适用于 [program:x] 段中指定的子进程)中被覆盖。这些“环境”设置是累加的。换句话说,每个子过程的环境将包括:

在shell中设置的环境变量用于启动supervisord ...

...添加到/覆盖的...

...在“环境”全局中设置的环境变量

配置选项...

...添加到/覆盖的...

...supervisor特定的环境变量

SUPERVISOR_ENABLEDSUPERVISOR_PROCESS_NAMESUPERVISOR_GROUP_NAME)。

...添加到/覆盖的...

...每个进程中设置的环境变量

“environment”config选项。

supervisord 运行子进程时,不执行任何shell,因此诸如 USERPATHHOMESHELLLOGNAME 等的环境变量不改变其默认值或以其它方式重新分配。这是特别重要的,当你运行一个程序从一个 supervisord 运行作为根用户配置中的一个 user= 节。与 cron 不同,supervisord 在对 user= 程序配置选项中定义的用户执行setuid操作时,不会尝试去渲染和覆盖像 USERPATHHOMELOGNAME 这样的“基本”环境变量。如果您需要为特定程序设置环境变量(否则可能会由特定用户的shell调用设置),则必须在 environment= 程序配置选项中明确地设置。设置这些环境变量的示例如下。

[program:apache2]
command=/home/chrism/bin/httpd -c "ErrorLog /dev/stdout" -DFOREGROUND
user=chrism
environment=HOME="/home/chrism",USER="chrism"

过程国

在任何给定时间,由超级驾驶员控制的过程将处于以下状态之一。您可能会在客户端中的各种用户界面元素中看到这些状态名称。

STOPPED (0)

由于停止请求或从未启动,进程已停止。

STARTING (10)

该过程由于启动请求而开始。

RUNNING (20)

进程正在运行。

BACKOFF (30)

该过程进入 STARTING 状态,但随后退出太快而不能移动到 RUNNING 状态。

STOPPING (40)

由于停止请求,进程正在停止。

EXITED (100)

该过程从 RUNNING 状态退出(预期或意外)。

FATAL (200)

无法成功启动此过程。

UNKNOWN (1000)

进程处于未知状态(supervisord 编程错误)。

在supervisor下运行的每个进程通过这些状态按照下面的有向图进行。

Subprocess State Transition Graph

子过程状态转换图

如果进程已被管理停止或者从未启动,则进程处于 STOPPED 状态。

当自动重新启动过程处于 BACKOFF 状态时,将由 supervisord 自动重新启动。它将在 STARTINGBACKOFF 状态之间切换,直到明显它不能被启动,因为 startretries 的数量已经超过最大值,在该点它将转变到 FATAL 状态。每次开始重试将花费更多的时间。

当进程处于 EXITED 状态时,它将自动重新启动:

  • 永远不要将其 autorestart 参数设置为 false

  • 无条件地将其 autorestart 参数设置为 true

  • 条件性地将其 autorestart 参数设置为 unexpected。如果退出时退出代码与进程的 exitcodes 配置参数中定义的退出代码不匹配,则将重新启动。

作为被配置为有条件地或无条件地自动重新启动的结果,过程自动从 EXITED 转换到 RUNNINGRUNNINGEXITED 之间的转换数量不以任何方式限制:可以创建无限重新启动退出进程的配置。这是一个功能,而不是错误。

如果自动重新启动的进程最终处于 FATAL 状态(必须从此状态手动重新启动),则永远不会自动重新启动。

过程通过管理停止请求转换到 STOPPING 状态,然后将最终处于 STOPPED 状态。

无法成功停止的进程将永远保留在 STOPPING 状态。在正常操作期间不应该达到这种情况,因为它意味着该过程没有响应由管理员发送给它的最终 SIGKILL 信号,这在UNIX下是“不可能的”。

总是需要用户操作来调用的状态转换是这些:

FATAL - > STARTING

RUNNING - > STOPPING

状态转换通常但并不总是需要用户操作来调用这些转换,除非注明:

STOPPED - > STARTING (除非在supervisord启动,如果进程被配置为自动启动)

EXITED - > STARTING (除非将进程配置为autorestart)

所有其他状态转换由supervisord自动管理。