supervisor系列:2、运行supervisor
文章目录
本节在解释如何运行 supervisord和 supervisorctl命令时引用
BINDIR
。这是Python安装配置的" bindir "目录。例如,通过
./configure ——prefix=/usr/local/py; make; make install
的python安装时,
BINDIR
应该是
/usr/local/py/bin
。不同平台上的Python解释器使用不同的
BINDIR
。如果你不知道
setup.py install
的输出在哪里,请查看它。
1. 添加一个程序
在supervisord将为您做任何有用的事情之前,您需要在其配置中添加至少一个program
段。program
段将定义在调用supervised命令时运行和管理的程序。要添加程序,您需要编辑supervisord.conf
文件。
要运行的最简单的程序之一是UNIX cat程序。下面显示的program
段将在启动supervisord进程时运行cat
。
[program:foo]
command=/bin/cat
这个节可以剪切并粘贴到supervisord.conf
文件中。这是最简单的程序配置,因为它只命名一个命令。程序配置部分有许多其他配置选项,这里没有显示。更多信息请参见[program:x]设置部分。
2. 运行supervisord
要运行supervisord,运行$BINDIR/supervisord
。生成的进程将自己守护并与终端分离。它将操作日志默认保存在$CWD/supervisor.log
。
你可以在前台通过在命令行中传递-n
标志来启动supervisord可执行文件。这对于调试启动问题很有用。
警告:
当supervisord启动时,它将在默认位置(包括当前工作目录)中搜索配置文件。如果您具有安全意识,您可能希望在指定配置文件绝对路径的supervisord命令后指定一个" -c "参数,以确保某人不会欺骗您从包含流氓的supervisord.conf
文件的目录中运行supervisor。当不带-c
参数的supervisor作为root启动时,会发出一个警告。
如果要改变supervisord控制的程序集,请编辑supervisor.conf
文件并kill -HUP
或重启supervisord程序。这个文件有几个示例程序定义。
supervised命令接受许多命令行选项。这些命令行选项中的每一个都覆盖配置文件中的任何等价值。
2.1 supervisord命令行配置
-c FILE, --configuration=FILE | supervisord配置文件的路径 |
---|---|
-n, --nodaemon | 前台运行supervisord |
-s, --silent | 没有指向stdout(标准输出)的输出 |
-h, --help | 显示supervisord的帮助信息 |
-u USER, --user=USER | UNIX用户名或数字用户id。如果supervisor是以root用户启动的,请在启动过程中尽快将setuid设置为这个用户 |
-m OCTAL, --umask=OCTAL | 表示umask的八进制数字(例如022),supervisord启动后应该使用它。 |
-d PATH, --directory=PATH | 当supervisord作为守护进程运行时,在守护进程之前cd到这个目录。 |
-l FILE, --logfile=FILE | 用作supervisord活动日志的文件名路径。 |
-y BYTES, --logfile_maxbytes=BYTES | 在循环发生之前,supervisor活动日志文件的最大大小。该值是后缀的乘积,例如“1”是一个字节,“1MB”是1兆字节,“1GB”是1g字节。 |
-z NUM, --logfile_backups=NUM | 要保留的supervisord活动日志的备份副本数量。每个日志文件的大小为logfile_maxbytes 。 |
-e LEVEL, --loglevel=LEVEL | supervisor应该写入活动日志的日志级别。有效的级别是trace ,debug ,info ,warn ,error 和critical |
-j FILE, --pidfile=FILE | supervisord应该写入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 | 将supervisord版本号打印到stdout并退出。 |
–profile_options=LIST | 用于分析的逗号分隔选项列表。使supervisord在profiler下运行,并根据选项输出结果,选项是以下逗号分隔的列表:cumulative ,calls ,callers 。如cumulative,callers |
–minprocs=NUM | 在supervisord进程成功启动之前,可用的OS进程槽的最小数目 |
3. 运行supervisorctl
执行$BINDIR/supervisorctl
命令启动supervisorctl。您将看到一个shell,它将允许您控制当前由supervisord管理的进程。在提示符处键入“help”以获得所支持的命令的相关信息。
当使用命令行参数调用时,可以使用“一次性”命令调用supervisorctl可执行文件。例如:supervisorctl stop all
。如果命令行中有参数,它将阻止交互shell被调用。相反,该命令将被执行,并且supervisorctl将退出,其代码为0表示成功或运行,非0表示错误。举个例子:supervisorctl status all
将返回非零,如果任何单个进程没有运行的话。
如果在交互式模式下对需要身份验证的supervisord调用supervisorctl,您将被要求身份验证凭据。
3.1 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]
action是像“tail”或“stop”这样的命令。如果在命令行中指定了-i或没有指定操作,将启动一个解释交互键入的操作的“shell”。使用action“help”来找出可用的action。
3.2 supervisorctl动作
help
打印可用操作的列表
help <action>
打印<action>帮助
add <name> […]
激活进程/组配置中的任何更新
remove <name> […]
从活动配置中删除进程/组
update
Reload config and add/remove as necessary, and will restart affected programs
update all
根据需要重新加载config和add/remove,将重新启动受影响的程序
update <gname> […]
更新特定的组,将重启受影响的程序
clear <name>
清除进程的日志文件。
clear <name> <name>
清除多个进程的日志文件
clear all
清除所有进程日志文件
fg <process>
在前台模式下连接进程按Ctrl+C退出前台
pid
得到supervisord的PID。
pid <name>
通过名称获取单个子进程的PID。
pid all
获取每个子进程的PID,每行一个。
reload
重启远程supervisord
reread
重新加载守护进程的配置文件,不需要添加/删除(不需要重启)
restart <name>
重启进程注意:重启不会重新读取配置文件。关于这一点,请参阅重读和更新。
restart <gname>:*
重启组内所有进程注意:重启不会重新读取配置文件。关于这一点,请参阅重读和更新。
restart <name> <name>
重启多个进程或组注意:重启不会重新读取配置文件。关于这一点,请参阅重读和更新。
restart all
重启所有进程注意:Restart不会重新读取配置文件。关于这一点,请参阅重读和更新。
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)
输出进程日志的最后一部分
例如:
tail -f <name> 命名进程stdout的连续尾部按Ctrl-C退出。
tail -100 <name> 进程stdout的最后100 字节
tail <name> stderr 进程stderr的最后1600 字节
4. 信号
supervisord程序可能会被发送信号,使其在运行时执行某些操作。
您可以将这些信号中的任何一个发送到单个supervisord进程id。这个进程id可以在配置文件的[supervisord]
部分的pidfile
参数所表示的文件中找到(默认为$CWD/supervisord.pid
)。
4.1 信号句柄
SIGTERM
supervisord 和所有的子进程都会关闭。这可能需要几秒钟。
SIGINT
supervisord 和所有的子进程都会关闭。这可能需要几秒钟。
SIGQUIT
supervisord 和所有的子进程都会关闭。这可能需要几秒钟。
SIGHUP
supervisord 将停止所有进程,从找到的第一个配置文件重新加载配置,并启动所有进程。
SIGUSR2
supervisord 将关闭并重新打开主活动日志和所有子日志文件。
5. 运行时安全策略
开发人员已经尽了最大努力来确保使用作为root运行的supervisord进程不会导致意外的特权升级。但购者自慎。Supervisor不像DJ Bernstein的daemontools那样偏执,因为Supervisord允许在配置文件中任意指定写入数据的路径。允许任意的路径选择可能会导致符号链接攻击的漏洞。在配置中指定路径时要小心。确保没有特权的用户不能读取或写入supervisord配置文件,并且supervisor包安装的所有文件都有“健全的”文件权限保护设置。此外,确保您的PYTHONPATH
是正常的,并且所有Python标准库文件都有足够的文件权限保护。
6. 在开机时自动运行supervisord
如果您使用的是发行版打包的Supervisor版本,那么它应该已经集成到发行版的服务管理基础结构中。
以下是用户为各种操作系统提供的脚本:https://github.com/Supervisor/initscripts
如果你卡住了,这里有一些Serverfault的答案: How to automatically start supervisord on Linux (Ubuntu)