运行 Supervisor

本节在解释如何运行 supervisordsupervisorctl 命令时,参考了 BINDIR。这是您的 Python 安装已经配置的 “bindir” 目录。例如,对于通过 ./configure --prefix=/usr/local/py; make; make install BINDIR 应该是 /usr/local/py/bin。不同平台上的 Python 解释器使用不同的 BINDIR。如果你不知道你的安装在哪里,看看 setup.py install 的输出。

关于程序

supervisord 将为你做任何有用的事情之前,你需要在它的配置中添加至少一个 program section。program 部分将定义一个程序,当你调用 supervisord 命令时,该程序将被运行和管理。要添加一个程序,你需要编辑 supervisord.conf 文件。

UNIX cat 程序是可能运行的最简单的程序之一。当 supervisord 进程启动时,program 部分将运行 cat,如下图所示。

[program:foo]
command=/bin/cat

这一节可以剪切并粘贴到 supervisord.conf 文件中这是最简单的程序配置,因为它只命名一个命令。程序配置部分有许多其他配置选项,这里没有显示。更多信息请参见 [program:x] Section Settings

运行 supervisord

“运行 $BINDIR/supervisord 命令启动 supervisord。生成的进程将自动守护自己,并与终端分离。默认情况下,它会将操作日志保存在 $CWD/supervisor.log

你可以在前台通过在命令行中传递 -n 标志来启动 supervisord 可执行文件。这对调试启动问题很有用。

警告

“当 supervisord 启动时,它会在默认位置 包括当前工作目录 中搜索配置文件。如果你有安全意识,你可能会想在 supervisord 命令后指定一个 “-c” 参数,指定配置文件的绝对路径,以确保别人不会骗你在包含流氓 supervisord.conf 文件的目录下运行 supervisor。当没有 -c 参数的 supervisor 以 root 用户身份启动时,会发出警告。

要改变 supervisord 控制的程序集合,编辑 supervisord.conf 文件和 kill -HUP,或者重启 supervisord 进程。这个文件有几个示例程序定义。

supervisord 命令接受很多命令行选项。每个命令行选项都将覆盖配置文件中的任何等价的值。

supervisord 命令行选项

-c FILE, --configuration=FILE

supervisord 配置文件的路径。

-n, --nodaemon

在前台运行 supervisord

-s, --silent

没有指向标准输出的输出。

-h, --help

显示 supervisord 命令帮助。

-u USER, --user=USER

UNIX 用户名或数字用户 id。如果 supervisord 是以 root 用户身份启动的,在启动过程中尽快给这个用户 setuid。

-m OCTAL, --umask=OCTAL

表示 umask 的八进制数(例如 022),它应该在 supervisord 启动后被使用。

-d PATH, --directory=PATH

当 supervise 作为守护进程运行时,请在守护之前先 cd 到这个目录。

-l FILE, --logfile=FILE

作为 supervisord 活动日志使用的文件名路径。

-y BYTES, --logfile_maxbytes=BYTES

在发生旋转之前,supervisord 活动日志文件的最大大小。值是后缀乘,例如 “1” 是一个字节,”1MB” 是 1MB,”1GB” 是 1GB。

-z NUM, --logfile_backups=NUM

要保存的 supervisord 活动日志备份副本的数量。每个日志文件的大小为 logfile_maxbytes

-e LEVEL, --loglevel=LEVEL

supervisor 写入活动日志的日志级别。有效的级别 trace, debug, info, warn, errorcritical

-j FILE, --pidfile=FILE

supervisor 应该写入其 pid 文件的文件名。

-i STRING, --identifier=STRING

“由不同的客户端 UI 为这个 supervisor 实例公开的任意字符串标识符

-q PATH, --childlogdir=PATH

目录的路径(必须已经存在),其中 supervisor 将写入它的 AUTO` 模式的子进程日志。

-k, --nocleanup

防止 supervisord 在启动时执行清理(删除旧的 AUTO 进程日志文件)。

-a NUM, --minfds=NUM

supervisord 进程在成功启动之前必须可用的文件描述符的最小数量。

-t, --strip_ansi

从所有子日志进程中去除 ANSI 转义序列。

-v, --version

将 supervisor 版本号打印到 stdout 并退出。

--profile_options=LIST

用于分析的逗号分隔选项列表。原因 supervisord 在 profiler 下运行,并基于选项输出结果,这是一个逗号分隔的列表,包含以下内容: cumulativecallscallers 。如 cumulative,callers

--minprocs=NUM

在supervisor进程成功启动之前,操作系统进程可用的最小槽数。

运行 supervisorctl

启动 supervisorctl,执行 $BINDIR/supervisorctl。shell 将允许你控制当前由 supervisord 管理的进程。在提示符处输入 “help”,以获取有关所支持命令的信息。

当使用命令行参数调用时,supervisorctl 可执行文件可能被 “one time” 命令调用。例如:supervisorctl stop all。如果命令行中存在参数,它将阻止交互式 shell 被调用。相反,命令将被执行,supervisorctl 将退出,成功或运行的代码为 0,错误的代码为非 0。例如:supervisorctl status all 将返回非零,如果任何单个进程没有运行。

如果 supervisorctl 在交互模式下对需要验证的 supervisord 被调用,你将被要求验证凭据。

supervisorctl 命令行选项

-c, --configuration

配置文件路径(默认 /etc/supervisord.conf)

-h, --help

打印使用信息并退出

-i, --interactive

在执行命令后启动交互式 shell

-s, --serverurl URL

supervisord 服务器正在监听的 URL(默认 “http://localhost:9001”)。

-u, --username

与服务器进行身份验证使用的用户名

-p, --password

用于服务器身份验证的密码

-r, --history-file

保留 readline 历史记录(如果 readline 可用)

action [arguments]

“操作是像 “tail” 或 “stop” 这样的命令。如果在命令行上指定了 -i 或未指定操作,则会启动一个 “shell” 解释交互式键入的操作。使用操作 “help” 以了解可用的操作。

supervisorctl 操作

help

打印可用操作的列表

help <action>

打印 <action> 帮助

add <name> […]

激活进程/组配置中的任何更新

remove <name> […]

从活动配置中移除进程/组

update

重新加载配置并根据需要添加/删除,并将重新启动受影响的程序

update all

重新加载配置并根据需要添加/删除,并将重新启动受影响的程序

update <gname> […]

更新特定组,并将重新启动受影响的程序

clear <name>

清除进程的日志文件。

clear <name> <name>

清除多个进程的日志文件

clear all

清除所有进程的日志文件

fg <process>

连接前台模式的进程按 “Ctrl+C” 退出前台

pid

获取 supervisor 的 PID。

pid <name>

通过名称获取单个子进程的 PID。

pid all

获取每个子进程的 PID,每行一个。

reload

重启远程 supervisord

reread

重新加载守护进程的配置文件,不添加/删除(不重启)

restart <name>

重启进程,注意:重启不会重新读取配置文件。关于这一点,请参阅 reread and update。

restart <gname>:*

重启组内全部进程,注意:重启不会重新读取配置文件。关于这一点,请参阅 reread and update。

restart <name> <name>

重启多个进程。注意:Restart不会重新读取配置文件。关于这一点,请参阅reread and update。

restart all

重启全部进程,注意:重启不会重新读取配置文件。关于这一点,请参阅 reread and update。

signal

没有信号帮助

start <name>

启动进程

start <gname>:*

启动组内全部进程

start <name> <name>

启动多进程或者组

start all

启动全部进程

status

获取所有进程状态信息。

status <name>

按名称获取单个进程的状态。

status <name> <name>

获取多个命名进程的状态。

stop <name>

停止进程

stop <gname>:*

停止组内全部进程

stop <name> <name>

停止多进程或者组

stop all

停止全部进程

tail [-f] <name> [stdout|stderr] (default stdout)

Output the last part of process logs Ex: tail -f <name> Continuous tail of named process stdout Ctrl-C to exit. tail -100 <name> last 100 bytes of process stdout tail <name> stderr last 1600 bytes of process stderr

信号

supervisord 程序可能会被发送信号,导致它在运行时执行某些操作。

你可以将这些信号发送给 supervisord 进程 id。这个进程 id 可以在配置文件的 [supervisord] 部分的 pidfile 参数中找到(默认是 $CWD/supervisord.pid)。

信号句柄

SIGTERM

supervisord 和它的所有子进程都将关闭。这可能需要几秒钟。

SIGINT

supervisord 和它的所有子进程都将关闭。这可能需要几秒钟。

SIGQUIT

supervisord 和它的所有子进程都将关闭。这可能需要几秒钟。

SIGHUP

supervisord 将停止所有进程,重新加载它找到的第一个配置文件中的配置,然后启动所有进程。

SIGUSR2

supervisord 将关闭并重新打开主活动日志和所有子日志文件。

运行时安全

开发人员已经尽最大努力确保 supervisord 进程作为根用户运行不会导致意外的权限升级。但 caveat emptor。Supervisor 并不像 DJ Bernstein 的 daemontools 那样偏执,因为:program:“Supervisor”允许在配置文件中写入任意路径。允许任意路径选择可能会导致符号链接攻击的漏洞。在配置中指定路径时要小心。确保 supervisord 配置文件不能被非特权用户读取或写入,并且由 supervisor 包安装的所有文件都有“健全的”文件权限保护设置。此外,确保你的 PYTHONPATH 是正常的,并且所有 Python 标准库文件都有足够的文件权限保护。

运行 supervisord 自动启动

如果您使用的是Supervisor的发行版打包版本,那么它应该已经集成到您发行版的服务管理基础设施中了。

有针对各种操作系统的用户贡献的脚本,请参阅:https://github.com/Supervisor/initscripts

如果你卡住了,服务器故障有一些答案:如何在 Linux (Ubuntu) 上自动启动监督