0%

Supervisor 的配置文件

Supervisor 的配置文件通常命名为 supervisord.conf。它同时被 supervisordsupervisorctl 使用。如果那两个应用启动时没有指定 -c 选项(该选项用来把配置文件名明确告诉给应用),该应用就会按列举的顺序从下面的位置中寻找一个名为 supervisord.conf 的文件。它将使用最先找到的文件。

  1. ../etc/supervisord.conf(相对于可执行文件的位置)
  2. ../supervisord.conf(相对于可执行文件的位置)
  3. $CWD/supervisord.conf
  4. $CWD/etc/supervisord.conf
  5. /etc/supervisord.conf
  6. /etc/supervisor/supervisord.conf(Supervisor 3.3.0 以后)

许多 Debian 和 Ubuntu 管理的 Supervisor 版本包含一个增加 /etc/supervisor/supervisord.conf 至搜寻路径的补丁。最早包含此路径的 Supervisor 的 PyPI 包是 Supervisor 3.3.0。

文件格式

supervisord.conf 是一个 Windows 的 INI 风格(Python 的 ConfigParser)文件。它由节(由一个个的 [header] 表示)和节中的键/值对组成。这些节和它们允许指定的至如下所示。

环境变量

supervisord 启动时的环境存在的环境变量和可以在配置文件中以 Python 字符串表达式语法 %(ENV_X)s 使用:

1
2
[program:example]
command=/usr/bin/example --loglevel=%(ENV_LOGLEVEL)s

在上面的例子中,%(ENV_LOGLEVEL)s 表达式将被 LOGLEVEL 环境变量替换。

在 Supervisor 3.2 和更新的版本中,所有选项都支持 %(ENV_X)s 表达式。在从前的版本中,一些选项支持它们,不过大多数都不支持。参见下面的每个选项的文档。

[unix_http_server] 节的设置

supervisord.conf 文件有一个名为 [unix_http_server] 的节,用来引入一个需要的监听 UNIX 域套接字 HTTP 服务器参数的配置。如果配置文件中没有 [unix_http_server] 节,就不会启动 UNIX 域套接字 HTTP 服务器。如下是允许使用的配置值。

[unix_http_server] 节的值

file

一个 supervisor 将要监听 HTTP/XML-RPC 请求的 UNIX 域套接字。supervisorctl 在这个端口使用和 supervisord 交流。这个选项可以包括 %(here)s 格式的值,这将被替换成 supervisord 配置文件被发现的位置。

  • 默认值:None
  • 是否必填:否
  • 最早引入版本:3.0

echo_supervisord_conf 输出的配置示例使用 /tmp/supervisor.sock 作为套接字文件。那个路径仅仅是一个例子,很可能需要替换成一个更适合你系统的位置。有些系统会定期删除 /tmp 中较老的文件。如果套接字文件被删除了,supervisorctl 将无法连接到 supervisord

chmod

启动时修改 UNIX 域套接字的 UNIX 权限模式位为这个值。

  • 默认值:0700
  • 是否必填:否
  • 最早引入版本:3.0

chown

修改套接字文件的用户和组为这个值。可以是一个 UNIX 用户名(比如 chrism),也可以是用冒号分隔的 UNIX 用户名和组(比如 chrism:wheel)。

  • 默认值:使用启动 supervisord 的用户名和组
  • 是否必填:否
  • 最早引入版本:3.0

username

这个 HTTP 服务器需要用来获取权限的用户名。

  • 默认值:不需要用户名
  • 是否必填:否
  • 最早引入版本:3.0

password

这个 HTTP 服务器需要用来获取权限的密码。这可以是一个明文密码,也可以通过使用 {SHA} 前缀字符串的方式指定成 SHA-1 哈希值。比如,{SHA}82ab876d1387bfafe46cc1c8a2ef074eae50cb1d 是密码“thepassword”的 SHA 存储版本。

注意哈希过的密码必须是十六进制格式。

  • 默认值:不需要密码
  • 是否必填:否
  • 最早引入版本:3.0

[unix_http_server] 节的示例

1
2
3
4
5
6
[unix_http_server]
file = /tmp/supervisor.sock
chmod = 0777
chown= nobody:nogroup
username = user
password = 123

[inet_http_server] 节的设置

supervisord.conf 文件有一个名为 [inet_http_server] 的节,用来引入一个需要的监听 TCP(网络) 套接字 HTTP 服务器参数的配置。如果配置文件中没有 [inet_http_server] 节,就不会启动网络套接字 HTTP 服务器。如下是允许使用的配置值。

默认情况下,网络 HTTP 服务器是未启用的。如果你选择启用它,请阅读以下安全警告。网络 HTTP 服务器仅应该在可靠的环境中启用。他应该仅绑定在本地 localhost 或仅可被隔离且可靠的网络访问。网络 HTTP 服务器不支持任何形式的加密。网络 HTTP 服务器默认情况下不使用任何权限认证(参见 username=password= 选项)。网络 HTTP 服务器可以被 supervisorctl 远程操控。它也提供一个运行子进程启动和终止以及查看子进程日志的网络交互。永远不要把网络 HTTP 服务器暴露到公共互联网上。

[inet_http_server] 节的值

port

一个 supervisor 用来监听 HTTP/XML-RPC 请求的 TCP 主机:端口 值,或者比如说 127.0.0.1:9001supervisorctl 将在这个端口上使用 XML-RPC 和 supervisord 进行交流。若要监听此机器的所有接口,使用 :9001 或者 *:9001。请阅读上面的安全警告。

  • 默认值:无
  • 是否必填:是
  • 最早引入版本:3.0

username

这个 HTTP 服务器需要用来获取权限的用户名。

  • 默认值:不需要用户名
  • 是否必填:否
  • 最早引入版本:3.0

password

这个 HTTP 服务器需要用来获取权限的密码。这可以是一个明文密码,也可以通过使用 {SHA} 前缀字符串的方式指定成 SHA-1 哈希值。比如,{SHA}82ab876d1387bfafe46cc1c8a2ef074eae50cb1d 是密码“thepassword”的 SHA 存储版本。

注意哈希过的密码必须是十六进制格式。

  • 默认值:不需要密码
  • 是否必填:否
  • 最早引入版本:3.0

[inet_http_server] 节的示例

1
2
3
4
[inet_http_server]
port = 127.0.0.1:9001
username = user
password = 123

[supervisord] 节的设置

supervisord.conf 文件有一个名为 [inet_http_server] 的节,用来引入关于 supervisord 进程的全局配置。如下所示。

[supervisord] 节的值

logfile

supervisord 进程活动日志的路径。这个选项可以包括 %(here)s 值,它会被替换成配置文件被找到的目录。

如果 logfile 设置成像 /dev/stdout 的特殊文件是没办法找到的,要想禁用滚动刷日志只能通过设置 logfile_maxbytes = 0

  • 默认值:$CWD/supervisord.log
  • 是否必填:否
  • 最早引入版本:3.0

logfile_maxbytes

在滚动刷日志之前活动日志文件所能占用的最大字节数(这个值可以使用像“KB”、“MB”和“GB”的单位)。把这个值设置成 0 意味着不限制日志容量。

  • 默认值:50MB
  • 是否必填:否
  • 最早引入版本:3.0

logfile_backups

在活动日志滚动刷新产生文件保存的备份数目。如果设置为 0,则不会保存备份。

  • 默认值:10
  • 是否必填:否
  • 最早引入版本:3.0

loglevel

日志级别,决定了将要写入 supervisord 活动日志的内容。可以是如下选项之一: criticalerrorwarninfodebugtraceblather。注意在 debug 日志级别下,supervisord 日志文件将会记录它子进程的 stderr/stdout 输出和关于进程状态改变的额外信息,这对调试一个没有正常启动的进程十分有用。参见:活动日志级别

  • 默认值:info
  • 是否必填:否
  • 最早引入版本:3.0

pidfile

supervisord 存放 pid 文件的位置。这个选项可以包括 %(here)s 格式的值,这将被替换成 supervisord 配置文件被发现的位置。

  • 默认值:$CWD/supervisord.pid
  • 是否必填:否
  • 最早引入版本:3.0

umask

supervisord 进程的 umask

  • 默认值:022
  • 是否必填:否
  • 最早引入版本:3.0

nodaemon

如果设置成 true,supervisord 将会在前台运行,而非以守护进程的形式。

  • 默认值:false
  • 是否必填:否
  • 最早引入版本:3.0

silent

如果设置成 true 且以非守护进程形式执行,日志将不会指向标准输出(stdout)。

  • 默认值:false
  • 是否必填:否
  • 最早引入版本:4.2.0

minfds

supervisord 能够成功启动所需要的最小文件描述符数目。为了试图让 supervisord 进程的软硬限制提高到适合 minfds 的水平,将会调用 setrlimit 方法。硬限制或许只有当以 root 运行时才会提高。supervisord 会频繁使用文件描述符,如果不能从操作系统中获取时会进入失败模式,所以能指定一个确保程序运行过程中不会用光它们的最小值是很有用的。这些限制会被它管理的子进程继承。这个选项在 Solaris 上极其有用,因为它默认每个进程的 fd 限制都很小。

  • 默认值:1024
  • 是否必填:否
  • 最早引入版本:3.0

minprocs

supervisord 能够成功启动所需要的最小进程描述符数目。为了试图让 supervisord 进程的软硬限制提高到适合 minprocs 的水平,将会调用 setrlimit 方法。硬限制或许只有当以 root 运行时才会提高。如果操作系统用光了进程描述符,supervisord 将会进入失败模式,所以在 supervisord 启动时确保有足够的进程描述符时很有用的。

  • 默认值:200
  • 是否必填:否
  • 最早引入版本:3.0

nocleanup

阻止 supervisord 在启动的时候清理任何存在的 AUTO 子日志文件。这个在调试的时候很有用。

  • 默认值:false
  • 是否必填:否
  • 最早引入版本:3.0

childlogdir

AUTO 子日志文件使用的路径。这个选项可以包括 %(here)s 格式的值,这将被替换成 supervisord 配置文件被发现的位置。

  • 默认值:Python 的 tempfile.get_tempdir()
  • 是否必填:否
  • 最早引入版本:3.0

user

指示 supervisord 在执行任何有意义的进程之前,将用户切换为这个 UNIX user 账号。只有当 supervisord 以 root 用户启动的时候才能切换用户。

  • 默认值:不切换用户
  • 是否必填:否
  • 最早引入版本:3.0
  • 变更历史:3.3.4 版本。如果 supervisord 不能切换到指定的用户,将会在 stderr 写一条错误信息然后立即退出。在早期版本中,仍然会继续执行,不过会记录一条 critical 级别的日志信息。

directory

supervisord 以守护进程运行的时候,切换到这个路径。这个选项可以包括 %(here)s 格式的值,这将被替换成 supervisord 配置文件被发现的位置。

  • 默认值:不切换路径
  • 是否必填:否
  • 最早引入版本:3.0

strip_ansi

从子日志文件中删除所有 ANSI 转义序列。

  • 默认值:false
  • 是否必填:否
  • 最早引入版本:3.0

environment

一串 KEY="val",KEY2="val2" 形式的键/值对将会配置到 supervisord 进程的环境中(也会导致它所有的子进程环境中有这些变量)。这个选项可以包括 %(here)s 格式的值,这将被替换成 supervisord 配置文件被发现的位置。包含非数字之母符号的值需要用引号引起来(比如 KEY="val:123",KEY2="val,456")。在其他情况下不必非要把值引起来,但还是建议用引号引一下。要转义百分号,只需使用两个即可(比如 URI="/first%%20name")。注意子进程将继承启动 supervisord 时使用的终端的环境变量,除非它们被此处或 program 节的 environment 选项覆盖掉。参见子进程环境

  • 默认值:无值
  • 是否必填:否
  • 最早引入版本:3.0

identifier

此 supervisor 进程的描述符字符串,RPC 接口会用到。

  • 默认值:supervisor
  • 是否必填:否
  • 最早引入版本:3.0

[supervisord] 节的示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[supervisord]
logfile = /tmp/supervisord.log
logfile_maxbytes = 50MB
logfile_backups=10
loglevel = info
pidfile = /tmp/supervisord.pid
nodaemon = false
minfds = 1024
minprocs = 200
umask = 022
user = chrism
identifier = supervisor
directory = /tmp
nocleanup = true
childlogdir = /tmp
strip_ansi = false
environment = KEY1="value1",KEY2="value2"

[supervisorctl] 节的设置

配置文件中可以包括 supervisorctl 交互终端程序的设置。这些选项如下所示。

[supervisorctl] 节的值

serverurl

访问 supervisord 服务器所需使用的 URL,比如 http://localhost:9001。对于 UNIX 域套接字,使用 unix:///absolute/path/to/file.sock

  • 默认值: http://localhost:9001
  • 是否必填:否
  • 最早引入版本:3.0

username

通过 supervisord 服务器权限认证所需的用户名。这应该和你试图访问的 supervisord 服务器的端口或 UNIX 域套接字配置的 username 相同。

  • 默认值:无用户名
  • 是否必填:否
  • 最早引入版本:3.0

password

通过 supervisord 服务器权限认证所需的密码。这应该和你试图访问的 supervisord 服务器的端口或 UNIX 域套接字配置的明文 password 相同。这个值不能以 SHA 哈希值传递。与本文件中声明的其他密码不同,这里必须提供明文密码。

  • 默认值:无密码
  • 是否必填:否
  • 最早引入版本:3.0

prompt

supervisorctl 使用的提示字符串。

  • 默认值:supervisor
  • 是否必填:否
  • 最早引入版本:3.0

history_file

readline 持久化历史文件的路径。如果你通过指定一个路径启用了此特性,你的 supervisorctl 命令将被保存在该文件中,而且你可以使用 readline(比如上箭头)调用你上一个 supervisorctl 回话中执行过的命令。

  • 默认值:无文件
  • 是否必填:否
  • 最早引入版本:3.0a5

[supervisorctl] 节的示例

1
2
3
4
5
[supervisorctl]
serverurl = unix:///tmp/supervisor.sock
username = chris
password = 123
prompt = mysupervisor

[program:x] 节的设置

配置文件中必须有一个或多个 program 节,只有这样 supervisord 才能知道它应该开启和控制哪些程序。它头部的值是一个复合值。它以单词“program”开头,然后是一个英文的冒号,最后是程序的名字。形如的 [program:foo] 头部值表示的是一个名为“foo”的程序。这个名字在管理由此配置文件生成的进程的客户端应用中使用。创建一个没有名字的 program 节是错误的。名字中一定不能含有冒号和括号这样的字符。其他值可以通过使用 %(program_name)s 字符串表达式来指代程序名。

一个 [program:x] 节实际上指代的是一个 supervisor 的“同质进程组”(在 3.0 版本中)。组中的成员由配置中的 numprocsprocess_name 参数联合定义。默认情况下,如果 numprocs 和 process_name 没有改变其默认值,由 [program:x] 表示的组将被命名为 x,而且在其中会有一个名为 x 的单个的进程。这给老一点的 supervisor 发行版提供一点向上兼容性,因为从前没有把 program 节定义为同质进程组。

不过比如说,如果你有一个 [program:foo] 节,把 numprocs 值配置为 3,把 process_name 值配置为 %(program_name)s_%(process_num)02d 表达式,那么“foo”组将包含三个进程,名字分别为 foo_00foo_01foo_02。这使得仅使用一个 [program:x] 节创建很多相似的进程成为可能。所有的日志文件名,所有的环境字符串,还有程序的命令也都可以包括类似的 Python 字符串表达式,从而给每个进程传递略微不同的参数。

[program:x] 节的值

command

此程序启动时将会执行的命令。命令可以是绝对的(比如 /path/to/programname)或相对的(比如 programname)。如果使用相对命令,将会在 supervisord 的 $PATH 环境变量中寻找可执行文件。程序可以接受参数,比如 /path/to/program foo bar。命令行可以把带有空格的一组参数使用双引号传递给程序,比如 /path/to/program/name -p "foo bar"。注意 command 的值可以包含 Python 字符串表达式,比如 /path/to/programname --port=80%(process_num)02d 在运行时会展开为 /path/to/programname --port=8000。字符串表达式可以是包含键 group_namehost_node_nameprogram_nameprocess_numnumprocshere(supervisord 配置文件的路径)的字典和所有以 ENV_ 开头的 supervisord 的环境变量。被控制的程序本身不能是守护进程,因为 supervisord 认为它是其子进程的守护进程(参见 非守护子进程)。

如果命令看起来像是配置文件注释,它将会被截断,比如 command=bash -c 'foo ; bar' 会被截断成 command=bash -c 'foo。引号也无法阻止这个行为,因为配置文件加载器不会像 shell 那样解析命令。

  • 默认值:无默认值
  • 是否必填:是
  • 最早引入版本:3.0
  • 变更历史:4.2.0 版本。增加对 numprocs 展开的支持。

process_name

用来构成这个进程的 supervisor 进程名的 Python 字符串表达式。如果你不修改 numprocs 那么一般是不用设置这一项的。字符串表达式可以是包含键 group_namehost_node_nameprogram_nameprocess_numnumprocshere(supervisord 配置文件的路径)的字典。

  • 默认值:%(program_name)s
  • 是否必填:否
  • 最早引入版本:3.0

numprocs

Supervisor 将会启动和 numprocs 指明的数目一样多的程序实例。注意如果numprocs > 1,那么 process_name 表达式必须包含 %(process_num)s(或者其他任何有效的包含 process_num 的 Python 字符串表达式)。

  • 默认值:1
  • 是否必填:否
  • 最早引入版本:3.0

numprocs_start

用来计算 numprocs 从哪个数字开始的一个整数偏移量。

  • 默认值:0
  • 是否必填:否
  • 最早引入版本:3.0

priority

程序在启动和终止顺序上的相对优先级。较低的优先级意味着在各种客户端中使用聚合命令(比如:“start all”/“stop all”)启动时会先启动后终止。较高的优先级意味着程序会后启动先终止。

  • 默认值:999
  • 是否必填:否
  • 最早引入版本:3.0

autostart

如果设置为 true,程序将在 supervisord 启动的时候自动运行。

  • 默认值:true
  • 是否必填:否
  • 最早引入版本:3.0

startsecs

启动程序后持续运行多少秒才会认为该程序启动成功了(将该进程从 STARTING 状态转变成 RUNNING 状态)。如果该进程不需要持续运行任何时间就认为是运行成功,可将此值设置为 0

即便某个进程以一个“意料之中”的退出码退出(参见 exitcodes),如果该进程退出得比 startsecs 还要快的话仍然会被视为启动失败。

  • 默认值:1
  • 是否必填:否
  • 最早引入版本:3.0

startretries

supervisord 所能允许的尝试启动程序时的连续失败次数,超过此次数将不再试图启动程序,并将该进程置为 FATAL 状态。参见 进程状态 了解 FATAL 状态的解释。

  • 默认值:3
  • 是否必填:否
  • 最早引入版本:3.0

autorestart

指明当某个进程从 RUNNING 状态退出时是否应该自动重启。可选项包括 falseunexpectedtrue。如果设为 false,进程将不会自动重启。如果设为 unexpected,程序将会在以一个与该进程配置的退出码(参见 exitcodes)不一致的退出码退出时重启。如果设为 true,进程将无条件重启,不管退出码是多少。

autorestart 用来控制 supervisord 是否重启某个成功启动之后(进程处在 RUNNING 状态)退出的程序。

supervisord 在进程正在启动的过程中(进程处在 STARTING 状态)会以一个不同的机制重启。进程启动时的重试由 startsecsstartretries 控制。

  • 默认值:unexpected
  • 是否必填:否
  • 最早引入版本:3.0

exitcodes

此程序 autorestart 使用的“意料之中”的退出码清单。如果 autorestart 参数设置为 unexpected,并且进程以一个除 supervisor 的 stop 请求以外的任何方式退出,如果其退出码没有在此清单中定义,supervisord 将重启该进程。

  • 默认值:0
  • 是否必填:否
  • 最早引入版本:3.0

在 Supervisor 4.0 一起的版本中,默认值为 0,2。在 Supervisor 4.0 版本,默认值被修改成了 0

stopsignal

需要终止程序时用来杀死程序的信号。可用的选项有:TERM、HUP、INT、QUIT、KILL、USR1 和 USR2。

  • 默认值:TERM
  • 是否必填:否
  • 最早引入版本:3.0

stopwaitsecs

在程序被发送终止信号后,等待操作系统给 supervisord 返回一个 SIGCHLD 的秒数。如果这些秒过去后 supervisord 仍未收到该进程发来的 SIGCHLD, supervisord 将会尝试以最终 SIGKILL 的杀掉它。

  • 默认值:10
  • 是否必填:否
  • 最早引入版本:3.0

stopasgroup

如果设置为 true,此标识将使得 supervisor 向整个进程组发送终止信号,并且认为 killasgroup 也设置为 true。这对于诸如调试模式的 Flask 之类的程序很有用,它们不会将终止信号传递给它们的子进程,这会导致这些子进程成为孤儿进程。

  • 默认值:false
  • 是否必填:否
  • 最早引入版本:3.0b1

killasgroup

如果设置为 true,当通过向程序发送 SIGKILL 使其终止时,将会向其整个进程组发送此信号,这会将它的子进程也终止掉,对于诸如使用 multiprocessing 的 Python 程序之类的情形很有用。

  • 默认值:false
  • 是否必填:否
  • 最早引入版本:3.0a11

user

supervisord 指明使用此 UNIX 用户账号作为运行该程序的账号。此用户只有当 supervisord 以 root 用户运行的时候才能被切换。如果 supervisord 不能切换到指定的用户,程序将不会启动。

用户只是通过 setuid 改变。这不会启动登录 shell,也不会改变诸如 USERHOME 之类的环境变量。参见 Subprocess Environment 获取更多细节。

  • 默认值:不切换用户
  • 是否必填:否
  • 最早引入版本:3.0

redirect_stderr

如果设置为 true,会使得该进程的 stderr 输出将会发送给 supervisord 的 stdout 的文件提示符(用 UNIX shell 术语来说,这等价于执行 /the/program 2>&1)。

不要在 [eventlistener:x] 节中设置 redirect_stderr=true。事件监听者使用 stdoutstdinsupervisord 交流。如果 stderr 被重定向了,来自 stderr 的输出将会和事件监听者协议冲突。

  • 默认值:false
  • 是否必填:否
  • 最早引入版本:3.0 用于替代 2.0 版本的 log_stdoutlog_stderr

stdout_logfile

将进程的 stdout 输出存放到这个文件中(如果把 redirect_stderr 设置成了 true,stderr 输出也将会存放到此文件中)。如果未设置 stdout_logfile 或将其设置成了 AUTO,supervisor 将会自动选择一个文件位置。如果将其设置为 NONE,supervisord 将不会创建日志文件。当 supervisord 重启时,AUTO 模式下的日志文件和它们的备份文件将会被删除。stdout_logfile 的值可以包含 Python 字符串表达式,他们将会被字典中对应的值替换,可用的键包括: group_namehost_node_nameprocess_numprogram_namehere(supervisord 配置文件的路径)。

当启用日志滚动(stdout_logfile_maxbytes)时是不能让两个进程使用同一个日志文件(stdout_logfile)的。这将会导致文件一团糟。

如果 stdout_logfile 被设置成了类似于 /dev/stdout 一样的不可见的特殊文件,必须通过设置 stdout_logfile_maxbytes = 0 禁用日志滚动。

  • 默认值:AUTO
  • 是否必填:否
  • 最早引入版本:3.0,用于替代 2.0 版本的 logfile

stdout_logfile_maxbytes

在日志滚动前,stdout_logfile 所能使用的最大字节数(这个值里面可以使用“KB”、“MB”和“GB”之类的后缀)。将此值设置为 0 意味着不限制日志容量。

  • 默认值:50MB
  • 是否必填:否
  • 最早引入版本:3.0,用于替代 2.0 版本的 logfile_maxbytes

stdout_logfile_backups

进程 stdout 日志文件滚动前保留的 stdout_logfile 备份的数目。如果设置为 0,将不会保留备份。

  • 默认值:10
  • 是否必填:否
  • 最早引入版本:3.0,用于替代 2.0 版本的 logfile_backups

stdout_capture_maxbytes

当程序处于“stdout 捕获模式”(参见 Capture Mode)时写入到捕获 FIFO 中的最大字节数。这个值需要是一个整数(这个值里面可以使用“KB”、“MB”和“GB”之类的后缀)。如果此值为 0,进程捕获模式将会被关闭。

  • 默认值:0
  • 是否必填:否
  • 最早引入版本:3.0

stdout_events_enabled

如果设置为 true,当进程向其 stdout 文件提示符写入内容时 PROCESS_LOG_STDOUT 事件将会被抛出。只有当接收到数据时文件提示符没有处在捕获模式时事件才会被抛出(参见 Capture Mode)。

  • 默认值:0
  • 是否必填:否
  • 最早引入版本:3.0a7

stdout_syslog

如果设置为 true,stdout 将会随着其进程名一起被定向到 syslog。

  • 默认值:False
  • 是否必填:否
  • 最早引入版本:4.0.0

stderr_logfile

如果 redirect_stderr 没有被设置成 true,将会把进程的 stderr 输出存放到此文件中。接受和 stdout_logfile 相同的取值类型,并且可以包括与之相同的 Python 字符串表达式。

当启用日志滚动(stderr_logfile_maxbytes)时是不能让两个进程使用同一个日志文件(stderr_logfile)的。这将会导致文件一团糟。

如果 stderr_logfile 被设置成了类似于 /dev/stderr 一样的不可见的特殊文件,必须通过设置 stderr_logfile_maxbytes = 0 禁用日志滚动。

  • 默认值:AUTO
  • 是否必填:否
  • 最早引入版本:3.0

stderr_logfile_maxbytes

在日志滚动前,stderr_logfile 所能使用的最大字节数。接受和 stdout_logfile_maxbytes 相同的取值类型。

  • 默认值:50MB
  • 是否必填:否
  • 最早引入版本:3.0

stderr_logfile_backups

进程 stderr 日志文件滚动前保留的备份的数目。如果设置为 0,将不会保留备份。

  • 默认值:10
  • 是否必填:否
  • 最早引入版本:3.0

stderr_capture_maxbytes

当程序处于“stderr 捕获模式”(参见 Capture Mode)时写入到捕获 FIFO 中的最大字节数。这个值需要是一个整数(这个值里面可以使用“KB”、“MB”和“GB”之类的后缀)。如果此值为 0,进程捕获模式将会被关闭。

  • 默认值:0
  • 是否必填:否
  • 最早引入版本:3.0

stderr_events_enabled

如果设置为 true,当进程向其 stderr 文件提示符写入内容时 PROCESS_LOG_STDERR 事件将会被抛出。只有当接收到数据时文件提示符没有处在捕获模式时事件才会被抛出(参见 Capture Mode)。

  • 默认值:false
  • 是否必填:否
  • 最早引入版本:3.0a7

stderr_syslog

如果设置为 true,stderr 将会随着其进程名一起被定向到 syslog。

  • 默认值:False
  • 是否必填:否
  • 最早引入版本:4.0.0

environment

将会被替换到子进程的环境中的一组 KEY="val",KEY2="val2" 形式的键/值对。环境字符串可以包含 Python 字符串表达式,他们将会被字典中对应的值替换,可用的键包括: group_namehost_node_nameprocess_numprogram_namehere(supervisord 配置文件的路径)。如果值中包含了非数字字母的特殊符号应该用引号引起来(比如 KEY="val:123",KEY2="val,456")。在其他情况下不必非要把值引起来,但还是建议用引号引一下。注意子进程将继承启动“supervisord”时使用的终端的环境变量,除非它们被此处覆盖掉。参见 子进程环境

  • 默认值:无额外的环境
  • 是否必填:否
  • 最早引入版本:3.0

directory

supervisord 运行子进程之前暂时切换到的文件路径。

  • 默认值:不切换路径(继承 supervisor 的)
  • 是否必填:否
  • 最早引入版本:3.0

umask

代表进程 umask 的八进制数(比如 002、022).

  • 默认值:无特殊的 umask(继承 supervisor 的)
  • 是否必填:否
  • 最早引入版本:3.0

serverurl

SUPERVISOR_SERVER_URL(参见 supervisor.childutils)传递给子进程环境的 URL,用来让子进程更容易地同内部的 HTTP 服务器交流。如果提供了此值,其语法和结构需同 [supervisorctl] 节的同名选项一致。如果此值被设置成了 AUTO 或未设置,supervisor 将会自动构建一个服务器的 URL,优先监听 UNIX 域套接字,然后才是监听网络套接字。

  • 默认值:AUTO
  • 是否必填:否
  • 最早引入版本:3.0

[program:x] 节的示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[program:cat]
command=/bin/cat
process_name=%(program_name)s
numprocs=1
directory=/tmp
umask=022
priority=999
autostart=true
autorestart=unexpected
startsecs=10
startretries=3
exitcodes=0
stopsignal=TERM
stopwaitsecs=10
stopasgroup=false
killasgroup=false
user=chrism
redirect_stderr=false
stdout_logfile=/a/path
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stdout_events_enabled=false
stderr_logfile=/a/path
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB
stderr_events_enabled=false
environment=A="1",B="2"
serverurl=AUTO

[include] 节的设置

supervisord.conf 可能包含一个名为 [include] 的节。如果配置文件中包含了 [include] 节,它必须有一个名为“files”的键。此键对应的值指明要包含到配置中的其他配置文件。

[include] 节只会被 supervisord 执行。supervisorctl 会把它无视掉。

[include] 节的值

files

一个以空格分隔的文件通配符序列。每个文件通配符都可以是绝对的或是相对的。如果文件通配符是相对的,将会认为是相对于它所在的配置文件的存放路径。“通配符”是一种匹配某个特定的 UNIX shell 中使用的规则的文件样式。波浪号是不会被替换的,不过 *? 和使用 [] 表达的字符范围能够被正确匹配。字符串表达式将会被字典中对应的值替换,可用的键包括:host_node_namehere(supervisord 配置文件的路径)。不支持包含文件的递归包含。

  • 默认值:无默认值(必填)
  • 是否必填:是
  • 最早引入版本:3.0
  • 变更历史:3.3.0 版本。增加对 host_node_name 展开的支持。

[include] 节的示例

1
2
[include]
files = /an/absolute/filename.conf /an/absolute/*.conf foo.conf config??.conf

[group:x] 节的设置

一个很有用的做法是将“同质”的一组进程(又名“程序”)组合到一起成为“异质”的进程组,这样它们就可以作为一个单元被 Supervisor 不同的控制接口管理。

为了能把许多程序看作整体对待,你可以把他们设置成进程组,也就是在配置文件中定义一个 [group:x] 节。它头部的值是一个复合值。它以单词“group”开头,然后是一个英文的冒号,最后是进程组的名字。形如的 [group:foo] 头部值表示的是一个名为“foo”的进程组。这个名字在管理由此配置文件生成的进程的客户端应用中使用。创建一个没有名字的 group 节是错误的。名字中一定不能含有冒号和括号这样的字符。

对于一个 [group:x] 节,在配置文件的其他某个地方必须要有至少一个 [program:x] 节,进程组中必须要有引用进程名的 programs 值。

如果一组“同质”的进程(由 program 节表示)通过 [group:x] 节的 programs 配置行组合成了一个“异质”的进程组,program 节自动创建的同质进程组将不会在 supervisor 的运行时中存在。相反,属于每个同质进程组的进程会被统一放置到异质进程组中。例如,假设有如下的 group 配置:

1
2
3
[group:foo]
programs=bar,baz
priority=999

上面的假设中,在 supervisord 启动的时候,barbaz 的同质进程组将不复存在,那些本来属于他们的进程将会被移动到 foo 进程组中。

[group:x] 节的值

programs

由逗号分隔的进程名清单。清单中列举出来的进程将成为进程组的成员。

  • 默认值:无默认值(必填)
  • 是否必填:是
  • 最早引入版本:3.0

priority

安排给进程组的类似于 [program:x] 的 priority 值的优先级数值

  • 默认值:999
  • 是否必填:否
  • 最早引入版本:3.0

[group:x] 节的示例

1
2
3
[group:foo]
programs=bar,baz
priority=999

[fcgi-program:x] 节的设置

Supervisor 可以管理监听在完全相同套接字的 FastCGI 进程组。截至目前,FastCGI 部署的灵活性是有限的。若要获得完全的进程管理,你可以在 Apache 下使用 mod_fastcgi。不过这样的话你就会被 Apache 的每个连接都有一个进程或线程的低效并发模式所困扰。另外,随着获取越来越多的 CPU 和内存资源,每个连接模型的进程/线程会很快被一个较慢的资源饱和,这就会导致其他服务无法获得资源。为了能发挥例如 lighttpd 和 nginx 一类不包含内置进程管理器的事件驱动的网络服务的优势,你需要使用诸如 cgi-fcgi 或 spawn-fcgi 的脚本。这些可以和诸如 supervisord 和 daemontools 的进程管理器结合使用,不过需要每个 FastCGI 子进程都绑定在其自己的套接字上。这样做的缺陷有:不必要的复杂的网络服务配置,不优美的重启,以及容错能力低。如果 FastCGI 进程组能够共享套接字,随着配置的套接字的减少,网络服务器配置会大幅度降低。共享套接字允许优美的重启,因为任何一个子进程被充气的时候套接字都还绑定在其父进程中。最后,共享套接字的容错性更高,因为如果某个进程出错了,其他进程可以继续在绑定的连接中服务。

因为集成了对 FastCGI 子进程的支持,Supervisor 提供了两个世界最好的使用体验。通过共享套接字而非绑定特定的网络服务器的方式组合 FastCGI 进程,你将得到全特性的进程管理。它将关注点明确分离开了,是的网络服务器和进程管理器能各尽其能。

Supervisor 的套接字管理器开发时就原生支持 FastCGI 进程,不过不限于 FastCGI。如果没有特别配置的话,其他协议也是可以使用的。任何可以访问文件表字符套接字的程序(比如 Python 中的 socket.fromfd)都可以使用套接字管理器。在接管组中第一个子进程之前 Supervisor 将自动创建、绑定和监听套接字。套接字将被传递给所有编号为 0(zero)的文件提示符的子进程。当进程组中的最后一个子进程退后以后,Supervisor 将关闭套接字。

在 Supervisor 3.4.0 之前的版本中,FastCGI 程序([fcgi-program:x])不能被进程组([group:x])引用。

所有在 [program:x] 节中可用的选项都可以在 fcgi-program 节中使用。

[fcgi-program:x] 节的值

[fcgi-program:x] 节中有几个键是 [program:x] 节中没有的。

socket

此程序的 FastCGI 套接字,TCP 或 UNIX 域套接字皆可。对于 TCP 套接字,使用这种格式:tcp://localhost:9002。对于 UNIX 域套接字,使用 unix:///absolute/path/to/file.sock。字符串表达式将会被字典中对应的值替换,可用的键包括:host_node_namehere(supervisord 配置文件的路径)。

  • 默认值:无默认值
  • 是否必填:是
  • 最早引入版本:3.0

socket_backlog

设置套接字 listen(2) 的 backlog。

  • 默认值:socket.SOMAXCONN
  • 是否必填:否
  • 最早引入版本:3.4.0

socket_owner

对于 UNIX 域套接字而言,此参数可以用来指定 FastCGI 套接字的用户和组。可以是单个的 UNIX 用户名(比如 chrism)或者是用冒号分隔的用户名和组(比如 chrism:wheel)。

  • 默认值:使用为该 fcgi-程序设置的用户名和组
  • 是否必填:否
  • 最早引入版本:3.0

socket_mode

对于 UNIX 域套接字而言,此参数可以用来指明权限模式。

  • 默认值:0700
  • 是否必填:否
  • 最早引入版本:3.0

参考 [[program:x] 节的设置](#[program:x] 节的设置) 获取除上述的约束和补充之外的其他可用的键。

[fcgi-program:x] 节的示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[fcgi-program:fcgiprogramname]
command=/usr/bin/example.fcgi
socket=unix:///var/run/supervisor/%(program_name)s.sock
socket_owner=chrism
socket_mode=0700
process_name=%(program_name)s_%(process_num)02d
numprocs=5
directory=/tmp
umask=022
priority=999
autostart=true
autorestart=unexpected
startsecs=1
startretries=3
exitcodes=0
stopsignal=QUIT
stopasgroup=false
killasgroup=false
stopwaitsecs=10
user=chrism
redirect_stderr=true
stdout_logfile=/a/path
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stdout_events_enabled=false
stderr_logfile=/a/path
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_events_enabled=false
environment=A="1",B="2"
serverurl=AUTO

[eventlistener:x] 节的设置

Supervisor 允许在配置文件中定义专门的同质进程组(“事件监听者池”)。这些池包括用来接收和响应来自 supervisor 事件系统的事件通知的进程。参见 Events 获取事件如何工作和如何执行可以声明为事件监听者程序的解释。

注意,除了 stdout_capture_maxbytes 之外,[program:x] 节中可用的所有的选项都可以在 eventlistener 节使用。事件监听者不能把进程交流的事件发送到 stdout,不过可以发送到 stderr(参见 Capture Mode)。

[eventlistener:x] 节的值

[eventlistener:x] 节有几个 [program:x] 节没有的键。

buffer_size

事件监听者池的事件队列缓冲容量。如果某个监听者池的事件缓存溢出了(当某个事件监听者池不能维持发送给它的所有的事件的时候会发生这种情况),缓冲中最旧的事件将被丢弃。

events

用逗号分隔的此监听者“想要”接受通知的事件类型名称清单(参见 Event Types 获取一个有效的事件类型名称清单)。

result_handler

一个可以解析成 Python 可调用对象的 pkg_resources 入口点字符串。默认值为 supervisor.dispatchers:default_handler。指定其他可选择的结果处理程序是非常不必要的,所以没有用文档说明如何创建一个这样的配置。

参见 [[program:x] 节的设置](#[program:x] 节的设置) 获取除上述的约束和补充之外的其他可用的键。

[eventlistener:x] 节的示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
[eventlistener:theeventlistenername]
command=/bin/eventlistener
process_name=%(program_name)s_%(process_num)02d
numprocs=5
events=PROCESS_STATE
buffer_size=10
directory=/tmp
umask=022
priority=-1
autostart=true
autorestart=unexpected
startsecs=1
startretries=3
exitcodes=0
stopsignal=QUIT
stopwaitsecs=10
stopasgroup=false
killasgroup=false
user=chrism
redirect_stderr=false
stdout_logfile=/a/path
stdout_logfile_maxbytes=1MB
stdout_logfile_backups=10
stdout_events_enabled=false
stderr_logfile=/a/path
stderr_logfile_maxbytes=1MB
stderr_logfile_backups=10
stderr_events_enabled=false
environment=A="1",B="2"
serverurl=AUTO

[rpcinterface:x] 节的设置

在配置文件中加入 rpcinterface:x 设置仅对想要使用额外的自定义行为扩展的人有用。在示例配置文件中,有一个名为 [rpcinterface:supervisor] 的节。默认情况下,它大概是下面这个样子的。

1
2
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

要想让 supervisor 的标准启动正常工作,节必须保留在配置文件中。如果你不想让 supervisor 做除了它已经在盒子外面做了的任何其他事情,这是你需要知道的关于此类节的所有事情。

然而,如果你想增加 rpc 的接口名称空间从而自定义 supervisor,你可能需要增加额外的 [rpcinterface:foo] 节,这里的“foo”表示接口(来自 web 根路径)的名称空间,名为 supervisor.rpcinterface_factory 的值是一个可调用的工厂, 其中应当有一个签名函数接收一个单个的参数 supervisord 和操作配置中要求的许多关键字参数。任何定义在 [rpcinterface:x] 节中的额外的键/值对都会以关键字参数的形式传递到这个工厂中。

这里是一个工厂函数的示例,在 Python 包 my.package__init__.py 文件中创建。

1
2
3
4
5
6
from my.package.rpcinterface import AnotherRPCInterface

def make_another_rpcinterface(supervisord, **config):
retries = int(config.get('retries', 0))
another_rpc_interface = AnotherRPCInterface(supervisord, retries)
return another_rpc_interface

在配置文件中增加一个用来配置它的节。

1
2
3
[rpcinterface:another]
supervisor.rpcinterface_factory = my.package:make_another_rpcinterface
retries = 1

[rpcinterface:x] 节的值

supervisor.rpcinterface_factory

pkg_resources“入口点”打点格式的你的 RPC 接口工厂函数名。

  • 默认值:无默认值
  • 是否必填:否
  • 最早引入版本:3.0

[rpcinterface:x] 节的示例

1
2
3
[rpcinterface:another]
supervisor.rpcinterface_factory = my.package:make_another_rpcinterface
retries = 1