运行 Supervisor¶
本节在解释如何运行 supervisord 和 supervisorctl 命令时,参考了 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
,error
和critical
。- -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 下运行,并基于选项输出结果,这是一个逗号分隔的列表,包含以下内容:
cumulative
、calls
、callers
。如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) 上自动启动监督