Supervisor
参考:
环境:
- Supervisor 3.3.4
- CentOS7.x86_64
介绍
综述
Supervisor是一个C/S系统,允许用户在Unix-Like操作系统上控制许多进程。它受如下启发:
- Convenience
- Accuracy
- Delegation
- Process Group
特点
- Simple
- Centralized(统一)
- Efficient
- Extensible
- Compatible
- Proven(久经考验)
Supervisor组件
- supervisord
- Supervisor的服务器部分被命名为
supervisord
。负责启动子进程,响应客户端的子进程,重启奔溃或退出的子进程,记录其stderr
和stdout
,以及生成对应的事件 - 默认使用的配置文件为
/etc/supervisord.conf
——Windows-INI格式的文件,由于它包含了未加密的username和password,请保证它安全
- Supervisor的服务器部分被命名为
- supervisorctl
- Supervisor的客户端部分被命名为
supervisorctl
。用户可连接到不同的supervisord,status/stop/start子进程,获取supervisord中正在运行的进程列表 - 通过Unix domain socket或TCP socket与server通信,客户端在执行命令前应该先提供认证。客户端和服务端使用同一个配置文件
- Supervisor的客户端部分被命名为
- Web server
- Web界面,可通过它查看或控制进程状态
- XML-RPC接口
- 用于询问和控制管理程序及其运行的程序
平台要求
- 在Unix-Like系统上运行良好
- 不支持Windows系统
- Supervisor运行在Python2.4或之后的版本,不支持Python3
安装
安装方法取决于你的操作系统。
通过网络安装
- 推荐使用setuptools的
easy_install
- 下载Supervisor包并调用一个命令
使用Setuptools的网络安装
如果Python解释器安装了Setuptools:
|
|
不使用Setuptools的网络安装
如果系统上未安装Setuptools,那么你需要手动去下载Supervisor发行套件和安装它。
PYPI: https://pypi.python.org/pypi/supervisor
|
|
安装一个分发包
一些Linux发行版提供了可通过系统包管理工具安装Supervisor。这些包由第三方制作,包含了对特定发行版的一些修改。
|
|
通过pip安装
|
|
创建一个配置文件
由于我是通过yum
安装,所以supervisor
配置文件自动在/etc
下自动生成:
-
默认配置文件:
/etc/supervisord.conf
建议在此配置文件中加入[include]
,默认已包含此配置 -
目录:
/etc/supervisord.d
建议将每个配置单独写在此目录下
运行Supervisor
添加一个程序
在supervisord
为你做任何有用的事情之前,你至少需要在配置文件中添加一个程序部分。program部分将定义在调用supervisord命令时如何运行和管理一个程序。
一个最简单的栗子:
|
|
上面的栗子只命名了一个命令,还有很多其它关于程序部分的设置。
运行supervisord
使用supervisord
命令启动supervisord,进程将自我守护,并从终端分离。并将操作日志默认放于$CWD/supervisor.log
。
你可传递-n/--nodaemon
标志来将进程放置于前台,这样对于debug很有帮助。
要更改supervisord控制的程序集,请编辑配置文件并kill- HUP
,或以其它方式重新启动supervisord进程。
supervisord
命令接受许多命令行选项。这些命令行选项中的每一个都会覆盖配置文件中的任何等效值。
详细选项: http://www.supervisord.org/running.html#supervisord-command-line-options
运行supervisorctl
使用supervisorclt
命令启动supervisorctl客户端。如果需要验证supervisord调用,则系统会要求您提供验证凭据。
|
|
supervisorctl Actions
如果在命令行中指定了-i
或未指定任何操作(action),则将启动交互式输入的shell解释操作。
|
|
Signals
supervisord程序可能会发送某些actions,让它在运行时执行某些操作。你可将这些信号发送到一个单一的supervisord的PID。
信号处理程序
SIGTERM
- supervisord及其所有子进程都将关闭
SIGINT
- supervisord及其所有子进程都将关闭
SIGQUIT
- supervisord及其所有子进程都将关闭
SIGHUP
- supervisord将关闭所有进程,重新载入配置文件并启动所有进程
SIGUSR2
- supervisord将关闭并重新打开主要活动日志和所有子日志文件
运行安全
开发人员尽力确保以root身份运行的supervisord进程不会导致意外的权限升级。但supervisord允许在其配置文件中的任意路径规范写入数据,允许任意路径选择可能会造成符号链接工具的漏洞。 确保supervisord配置文件的权限安全,除此之外,确保Python PATH和标准库都有足够的文件权限保护。
开机自启
由于我是yum
安装,所以能够直接使用系统服务管理来设置开机自启。
配置文件
Supervisor的配置文件通常命名为supervisord.conf
。如果没有指定-c
配置文件,应用程序会从以下位置去寻找配置文件:
- $CWD/supervisord.conf
- $CWD/etc/supervisord.conf
- /etc/supervisord.conf
- /etc/supervisor/supervisord.conf (since Supervisor 3.3.0)
- ../etc/supervisord.conf (Relative to the executable)
- ../supervisord.conf (Relative to the executable)
文件格式
supervisord.conf
is a Windows-INI-style (Python ConfigParser) file.
它包含section([header])和section中的key/value对。
环境变量
使用Python字符串表达式语法%(ENV_X)%
,可以在配置文件中使用环境中存在的环境变量
|
|
[unix_http_server]
在此section中应该插入在Unix domain socket上监听的HTTP server的配置参数。 如果没有配置此section,则Unix domain socket HTTP server将不会启动。
|
|
[inet_http_server]
监听TCP(internet) socket 的HTTP server的配置参数。 如果此section未配置,inet HTTP server将不会启动。
|
|
[supervisord]
与supervisord进程有关的全局设置。
|
|
[supervisorctl]
supervisorctl
交互式shell程序。
|
|
[program:x]
supervisord知道的应该启动和控制的程序。
|
|
[include]
如果配置文件包含[include]
部分,则它必须包含一个名为files
的key。该key中的值包含了其它配置文件。
|
|
[group:x]
将同质进程组组合成一个异质进程组通常很有用,所以它们可以作为supervisor各种控制器接口的一个单元进行控制。
|
|
[fcgi-program:x]
|
|
[eventlistener:x]
supervisor允许在配置文件中定义专门的同质进程组(event listener pools)。
|
|
[rpcinterface:x]
[rpcinterface:x]
适用于希望通过自定义行为扩展supervisor的人们。