Supervisor:一个进程控制系统
Supervisor是一个客户端/服务系统,允许其用户监控和控制类似UNIX的操作系统上的多个进程。
它具有一些相同的目的的程序,例如launchd、daemontools和runit。与这些程序中的某些程序不同,它不打算作为“进程ID 1”的替代init
运行。相反,它打算用于控制与项目或客户相关的进程,并且打算在启动时像任何其它程序一样启动。
知道你们时间宝贵,看第一节应该就能满足你们的需要。如果想多了解Supervisor的话,比如一些具体配置,可以看后面几节。
Supervisor是用Python写的,安装pip
[root@solang ~]# yum -y install epel-release
[root@solang ~]# yum -y install python-pip
# CentOS默认安装pip版本8.1.2,可先升级pip
[root@solang ~]# pip install --upgrade pip
# 此命令会将supervisor安装在`~/.local`目录下
[root@solang ~]$ pip install supervisor
不想安装pip
或不想安装在~/.local
目录,可以下载supervisor-4.2.0.tar.gz,解压
[solang@solang ~]$ tar -zxf supervisor-4.2.0.tar.gz -C /usr/local/
# 切换root
[root@solang ~]$ cd /usr/local/supervisor-4.2.0/
[root@solang supervisor-4.2.0]# python setup.py install
# 编译后会多出两个目录,其它文件或目录可以删除
[solang@solang supervisor-4.2.0]$ ll
drwxr-xr-x. 4 root root 43 May 15 14:57 build
drwxr-xr-x. 2 root root 40 May 15 14:57 dist
以root
用户执行将主配置文件放到/usr/etc/
目录
[root@solang ~]# echo_supervisord_conf > /usr/etc/supervisord.conf
# 赋予读写权限
[root@solang ~]# chmod 646 /usr/etc/supervisord.conf
切换到普通用户,根据需要修改,user=solang
建议一定要配置,会以普通用户启动supervisord。[include]
部分一定要配置,用于访问自定义程序的配置。
[solang@solang ~]$ vi /usr/etc/supervisord.conf
[unix_http_server]
file=/usr/local/supervisor-4.2.0/supervisor.sock
# 若需要web UI访问,打开并配置
[inet_http_server]
port=192.168.86.100:9001
username=user
password=123
[supervisord]
logfile=/usr/local/supervisor-4.2.0/supervisord.log
pidfile=/usr/local/supervisor-4.2.0/supervisord.pid
user=solang
[supervisorctl]
serverurl=unix:///usr/local/supervisor-4.2.0/supervisor.sock
[include]
files = /usr/local/supervisor-4.2.0/config/*.config
保存后,创建[include]
部分的路径
# 创建目录,将程序文件放到config目录下
[solang@solang ~]$ midir /usr/local/supervisor-4.2.0/config
# 启动supervisord
[solang@solang ~]$ supervisord
[solang@solang aaa]$ supervisord -v
4.2.0
[solang@solang ~]$ cd /usr/local/supervisor-4.2.0/config
[solang@solang config]$ vi elasticsearch.config
[program:Elasticsearch]
command=/usr/local/elasticsearch-6.6.2/bin/elasticsearch
priority=998
autostart=true
autorestart=true
startsecs=60
startretries=3
stopsignal=TERM
stopwaitsecs=10
user=solang
stdout_logfile=/usr/local/logs/elasticsearch/elasticsearch.log
stdout_logfile_maxbytes=100MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stderr_logfile=/usr/local/logs/elasticsearch/elasticsearch.log
stderr_logfile_maxbytes=100MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB
这里面有3个坑,按上面配置启动不起来
1.配置的日志目录必须要存在
[solang@solang config]$ mkdir -p /usr/local/logs/elasticsearch
2.设置JAVA_HOME路径
这时启动elasticsearch仍然启动不起来
[solang@solang config]$ supervisorctl update
# 监控日志报错,启动不起来
[solang@solang config]$ tail -f /usr/local/supervisor-4.2.0/supervisord.log
INFO spawned: 'Elasticsearch' with pid 1711
INFO exited: Elasticsearch (exit status 1; not expected)
INFO gave up: Elasticsearch entered FATAL state, too many start retries too quickly
这时要去配置的日志输出目录查看
[solang@solang config]$ cat /usr/local/logs/elasticsearch/elasticsearch.log
which: no java in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin)
could not find java; set JAVA_HOME or ensure java is in PATH
要设置JAVA_HOME路径,Linux系统中设置的不起作用。
# 增加environment环境变量设置
[solang@solang config]$ vi elasticsearch.config
[program:Elasticsearch]
command=/usr/local/elasticsearch-6.6.2/bin/elasticsearch
environment=JAVA_HOME="/usr/local/jdk1.8.0_251"
priority=998
autostart=true
autorestart=true
startsecs=60
startretries=3
stopsignal=TERM
stopwaitsecs=10
user=solang
stdout_logfile=/usr/local/logs/elasticsearch
stdout_logfile_maxbytes=100MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stderr_logfile=/usr/local/logs/elasticsearch
stderr_logfile_maxbytes=100MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB
3.配置文件描述符数和线程数
这时启动elasticsearch仍然启动不起来
[solang@solang config]$ supervisorctl update
[solang@solang config]$ cat /usr/local/logs/elasticsearch/elasticsearch.log
[INFO ][o.e.t.TransportService ] [W5S_8e6] publish_address {
192.168.86.100:9300}, bound_addresses {
192.168.86.100:9300}
[INFO ][o.e.b.BootstrapChecks ] [W5S_8e6] bound or publishing to a non-loopback address, enforcing bootstrap checks
ERROR: [2] bootstrap checks failed
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
[2]: max number of threads [3795] for user [solang] is too low, increase to at least [4096]
[INFO ][o.e.n.Node ] [W5S_8e6] stopping ...
这个错误在安装Elasticsearch时遇到过,但是安装的时候我们文件描述符数和线程数都配置了,肯定就是supervisord要配置了。
修改/usr/etc/supervisord.conf
主配置文件,在[supervisord]
部分增加配置。
[solang@solang ~]$ vi /usr/etc/supervisord.conf
[supervisord]
minfds=65536
minprocs=4096
由于修改了主配置文件,supervisord
需要重启。坑又来了,执行supervisorctl reload
,发现子进程(即config目录下配置文件)重启了,supervisord
并没有重启,使用kill
命令杀进程。
[solang@solang ~]$ supervisorctl reload
[solang@solang ~]$ ps -ef | grep supervisord
solang 1490 1 0 18:24 ? 00:00:01 /usr/bin/python /usr/bin/supervisord
solang 2007 1969 0 19:37 pts/4 00:00:00 grep --color=auto supervisord
[solang@solang ~]$ kill -9 1490
[solang@solang ~]$ supervisord
# 查看子进程状态
[solang@solang ~]$ supervisorctl status
杀完进程再重新启动supervisord
,发现Elasticsearch启动成功了。
注意:startsecs=60
,这个时间尽量设置的大一些,在配置supervisord
的文件描述符数和线程数之前,这个键设置的值是3,然后在supervisord.log
的输出日志上Elasticsearch启动成功后3s时间supervisord
就以为Elasticsearch启动成功了,结果后面遇到了文件描述符数和线程数不够的问题。
另外,这里的优先级priority=998
,因为后面要启动Kibana,Elasticsearch肯定要比Kibana优先启动。
[solang@solang config]$ mkdir -p /usr/local/logs/kibana
[solang@solang config]$ vi kibana.config
[program:kibana]
command=/usr/local/kibana-6.6.2/bin/kibana
priority=999
autostart=true
autorestart=true
startsecs=60
startretries=3
stopsignal=TERM
stopwaitsecs=10
user=solang
stdout_logfile=/usr/local/logs/kibana/kibana.log
stdout_logfile_maxbytes=100MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stderr_logfile=/usr/local/logs/kibana/kibana.log
stderr_logfile_maxbytes=100MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB
配置完成后,启动Kibana
[solang@solang config]$ supervisorctl update
[solang@solang config]$ mkdir -p /usr/local/logs/redis-6.0.1
[solang@solang config]$ vi redis.config
[program:redis]
command=/usr/local/bin/redis-server /usr/local/redis-6.0.1/redis.conf
priority=998
autostart=true
autorestart=true
startsecs=60
startretries=3
stopsignal=TERM
stopwaitsecs=10
user=solang
stdout_logfile=/usr/local/logs/redis-6.0.1/redis.log
stdout_logfile_maxbytes=100MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stderr_logfile=/usr/local/logs/redis-6.0.1/redis.log
stderr_logfile_maxbytes=100MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB
注意: 这里的坑主要是command
键配置的命令要以前台方式启动。redis.conf
配置文件的中的daemonize
改为no
就行,如果没改动过,默认就是no
。
[solang@solang ~]$ vi /usr/local/redis-6.0.1/redis.conf
# By default Redis does not run as a daemon. Use 'yes' if you need it.
# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
daemonize no
这里设置priority=998
,因为后面要启动redis监控工具RedisInsight,redis肯定要比RedisInsight优先启动。
配置完成后,启动redis
[solang@solang config]$ supervisorctl update
[solang@solang config]$ mkdir -p /usr/local/logs/redisinsight
[solang@solang config]$ vi redisinsight.config
[program:redisinsight]
command=/usr/local/redisinsight-1.4.0/redisinsight-linux64-1.5.0
environment=REDISINSIGHT_HOST="192.168.86.100",REDISINSIGHT_HOME_DIR="/usr/local/redisinsight-1.4.0/.redisinsight"
priority=999
autostart=true
autorestart=true
startsecs=60
startretries=3
stopsignal=TERM
stopwaitsecs=10
user=solang
stdout_logfile=/usr/local/logs/redisinsight/redisinsight.log
stdout_logfile_maxbytes=100MB
stdout_logfile_backups=10
stdout_capture_maxbytes=1MB
stderr_logfile=/usr/local/logs/redisinsight/redisinsight.log
stderr_logfile_maxbytes=100MB
stderr_logfile_backups=10
stderr_capture_maxbytes=1MB
配置完成后,启动RedisInsight
[solang@solang config]$ supervisorctl update
浏览器访问http://192.168.86.100:9001/,输入配置的用户名和密码,可管理查看进程的运行状态。
设置服务脚本
[root@solang ~]# vi /usr/lib/systemd/system/supervisord.service
# supervisord service for systemd (CentOS 7.0+)
# by ET-:CS (https://github.com/ET-CS)
[Unit]
Description=Supervisor daemon
[Service]
Type=forking
User=solang
LimitNOFILE=65536
LimitNPROC=4096
ExecStart=/usr/bin/supervisord -c /usr/etc/supervisord.config
ExecStop=/usr/bin/supervisorctl shutdown
ExecReload=/usr/bin/supervisorctl reload
KillMode=process
Restart=on-failure
RestartSec=42s
[Install]
WantedBy=multi-user.target
设置开机启动
[root@solang ~]# chmod 664 /usr/lib/systemd/system/supervisord.service
# 设置指定的服务开机启动
[root@solang ~]# systemctl enable supervisord
# 查看指定的服务是否开机启动
[root@solang ~]# systemctl is-enabled supervisord
# 设置指定的服务开机不启动
[root@solang ~]# systemctl disable supervisord
# 启动服务
[root@solang ~]# systemctl start supervisord
# 修改supervisord.service后重新加载系统服务文件
[root@solang ~]# systemctl daemon-reload
开机启动设置后,执行reboot
[root@solang ~]# reboot
查看进程,启动成功了。
注意:
User
配置项表示以指定的用户名启动服务;
LimitNOFILE
和LimitNPROC
表示文件描述符数和线程数,由于在启动Elasticsearch的时候我们配置了supervisord的最小文件描述符数和最小进程数,所以在启动脚本中一定要加上这两个配置,不然启动不起来(这个问题找了好久才找到解决方式),详细的问题如下所述
[solang@solang ~]$ vi /usr/etc/supervisord.conf
[supervisord]
minfds=65536
minprocs=4096
如果没配置LimitNOFILE
和LimitNPROC
的话,reboot
后查看supervisord
的进程,发现并不存在。
尝试手动执行启动,发现出错
[root@solang ~]# systemctl start supervisord
Job for supervisord.service failed because the control process exited with error code. See "systemctl status supervisord.service" and "journalctl -xe" for details.
[root@solang ~]# journalctl -xe
solang systemd[1]: supervisord.service failed.
solang systemd[1]: supervisord.service holdoff time over, scheduling restart.
solang systemd[1]: Stopped Supervisor daemon.
-- Subject: Unit supervisord.service has finished shutting down
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit supervisord.service has finished shutting down.
solang systemd[1]: Starting Supervisor daemon...
-- Subject: Unit supervisord.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit supervisord.service has begun starting up.
solang supervisord[1285]: Error: The minimum number of file descriptors required to run this process is 65536 as per the "minfds" command-line argument or config file setting. The current environment will only allow you to open 65536 file descriptors. Either raise the number of usable file descriptors in your environment (see README.rst) or lower the minfds setting in the config file to allow the process to start.
solang supervisord[1285]: For help, use /usr/bin/supervisord -h
solang systemd[1]: supervisord.service: control process exited, code=exited status=2
solang systemd[1]: Failed to start Supervisor daemon.
-- Subject: Unit supervisord.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit supervisord.service has failed.
--
-- The result is failed.
solang systemd[1]: Unit supervisord.service entered failed state.
solang systemd[1]: supervisord.service failed.
solang polkitd[696]: Registered Authentication Agent for unix-process:1289:27511 (system bus name :1.23 [/usr/bin/pkttyagent --notify-fd 5 --fallback], object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8)
错误:根据“minfds”命令行参数或配置文件设置,运行此进程所需的文件描述符的最小数量为65536。当前环境仅允许你打开65536个文件描述符。增加环境中可用文件描述符的数量(请参阅README.rst),或降低配置文件中的minfds
设置以允许进程启动。
然后找资料,配置LimitNOFILE=65536
后再手动执行启动,启动不起来
[root@solang ~]# systemctl daemon-reload
[root@solang ~]# systemctl start supervisord
[root@solang ~]# journalctl -xe
solang systemd[1]: supervisord.service failed.
solang polkitd[696]: Registered Authentication Agent for unix-process:14362:15760167 (system bus name :1.117 [/usr/bin/pkttyagent --notify-fd 5 --fallback], object path /org/freedesktop/PolicyKit1/AuthenticationAgent, locale en_US.UTF-8)
solang systemd[1]: supervisord.service holdoff time over, scheduling restart.
solang systemd[1]: Stopped Supervisor daemon.
-- Subject: Unit supervisord.service has finished shutting down
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit supervisord.service has finished shutting down.
solang systemd[1]: Starting Supervisor daemon...
-- Subject: Unit supervisord.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit supervisord.service has begun starting up.
solang supervisord[14368]: Error: The minimum number of available processes required to run this program is 4096 as per the "minprocs" command-line argument or config file setting. The current environment will only allow you to open 4096 processes. Either raise the number of usable processes in your environment (see README.rst) or lower the minprocs setting in the config file to allow the program to start.
solang supervisord[14368]: For help, use /usr/bin/supervisord -h
solang systemd[1]: supervisord.service: control process exited, code=exited status=2
solang systemd[1]: Failed to start Supervisor daemon.
-- Subject: Unit supervisord.service has failed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit supervisord.service has failed.
--
-- The result is failed.
solang systemd[1]: Unit supervisord.service entered failed state.
错误:根据“minprocs”命令行参数或配置文件设置,运行该程序所需的最小可用进程数为4096。当前环境仅允许你打开4096个进程。增加环境中可用进程的数量(请参阅README.rst)或降低配置文件中的minprocs
设置以允许程序启动。
找资料,配置LimitNPROC=4096
后再手动执行启动,发现启动成功了。
由于在启动Elasticsearch时配置了系统的最大文件描述符数和线程数,然后将其交由supervisord管理时需要配置主配置文件的最小文件描述符数minfds和最小进程数minprocs,所以在自启动脚本中指定文件描述符数和进程数后,运行成功了。
supervisorctl status //查看所有进程的状态
supervisorctl stop process_name //停止
supervisorctl start process_name //启动
supervisorctl restart process_name //重启
supervisorctl update //配置文件修改后使用该命令加载新的配置
supervisorctl reload //重新启动配置中的所有程序
Supervisor是一个客户端/服务系统,允许其用户控制类似UNIX的操作系统上的多个进程。它受到以下方面的启发:
需要为每个单进程实例编写rc.d
脚本通常很不方便。rc.d
脚本是进程初始化/自动启动/管理的一个很好的最基本形式,但是编写和维护它们可能很麻烦。此外,rc.d
脚本不能自动重新启动崩溃的进程,并且许多程序在崩溃时不能正确地自行重启。Supervisord将进程作为其子进程启动,并且可以配置为在崩溃时自动重新启动它们。它也可以将其自动配置为自行调用启动进程。
在UNIX上,通常很难获得进程准确的启动/关闭状态。Pidfile经常说谎。Supervisord将进程作为子进程启动,因此它始终了解其子进程的真实启动/关闭状态,并且可以方便地查询这些数据。
需要控制进程状态的用户通常只需要这样做。他们不想或不需要完整的Shell访问运行这些进程的计算机。监听“低”TCP端口的进程通常需要以root用户(UNIX错误特性)身份启动和重新启动。通常情况下,允许“普通”用户停止或重新启动这样的进程是完全可以的,但是为他们提供shell访问权限通常是不切实际的,并且为他们提供root访问权限或sudo访问权限通常是不可能的。也很难(正确)向他们解释为什么存在此问题。如果supervisord是以root用户身份启动的,则可以允许“普通”用户控制此类进程,而无需向他们解释问题的复杂性。Supervisorctl允许以非常有限的方式访问计算机,实质上是允许用户通过从简单的Shell或Web UI发出“stop”、“start”和“restart”命令来查看进程状态并控制受supervisord监督的子进程。
进程通常需要以组的形式启动和停止,有时甚至需要按照“优先级顺序”进行。通常很难向人们解释如何做。Supervisor允许你为进程分配优先级,并允许用户通过supervisorctl客户端发出命令,如“start all”和“restart all”,这将按照预先分配的优先级顺序启动它们。此外,可以将进程分组到“进程组”中,并且可以将一组逻辑相关的进程作为一个单元停止和启动。
Supervisor通过一个简单易学的INI风格配置文件进行配置。它提供了许多每个进程的选项,使你的工作变得更轻松,例如重新启动失败的进程和自动日志轮换。
Supervisor为你提供了一个启动、停止和监控进程的地方。进程可以单独或按组控制。你可以配置Supervisor以提供本地或远程命令行和Web界面。
Supervisor通过fork/exec启动其子进程,并且子进程不进行守护进程。进程终止时,操作系统会立即向Supervisor发送信号,这与某些依赖麻烦的PID文件和定期轮询来重新启动失败的进程的解决方案不同。
Supervisor具有一个简单的事件通知协议,该协议可以使用任何语言编写的程序对其进行监控,还有一个用于控制的XML-RPC接口。Python开发人员可以利用这些扩展点构建。
除Windows外,Supervisor几乎适用于所有其它方面。它已在Linux、Mac OS X、Solaris和FreeBSD上经过测试和支持。它完全用Python编写,因此安装不需要C编译器。
尽管Supervisor如今非常活跃,但它不是新软件。Supervisor已经存在了多年,并且已经在许多服务上使用。
supervisor的服务部分被称为supervisord。它负责自行调用启动子程序,响应来自客户端的命令,重新启动崩溃或退出的子进程,记录其子进程stdout
和stderr
输出以及生成和处理与子进程生命周期中的点相对应的“事件”。
服务进程使用配置文件。它通常位于/etc/supervisord.conf
中。此配置文件是“Windows-INI”风格的配置文件。通过适当的文件系统权限来确保此文件的安全很重要,因为它可能包含未加密的用户名和密码。
supervisor的命令行客户端部分被称为supervisorctl。它为supervisord提供的特性提供了类似于shell的界面。从supervisorctl,用户可以连接到不同的supervisord进程(一次一个),获取由其控制的子进程的状态,停止和启动子进程,以及获取supervisord正在运行的进程列表。
命令行客户端通过UNIX域套接字或Internet(TCP)套接字与服务对话。服务可以断言客户端的用户应在允许客户端执行命令之前出示身份验证凭据。客户端进程通常使用与服务相同的配置文件,但是任何带有[supervisorctl]
部分的配置文件都可以工作。
如果针对Internet套接字启动supervisord,则可以通过浏览器访问功能类似于supervisorctl的(稀疏)Web用户界面。激活配置文件的[inet_http_server]
部分后,访问服务URL(例如http://localhost:9001/
)以通过Web界面查看和控制进程状态。
为Web UI提供服务的同一HTTP服务提供了一个XML-RPC接口,该接口可用于询问和控制supervisor及其运行的程序。请参阅XML-RPC API文档。
Supervisor已经经过测试,已知可以在Linux (Ubuntu 9.10)、Mac OS X (10.4/10.5/10.6)、Solaris (10 for Intel)和FreeBSD 6.1上运行。它可能在大多数UNIX系统上运行良好。
Supervisor完全不会在任何Windows版本下运行。
Supervisor使用于在Python 3版本3.4或更高版本以及Python 2版本2.7上工作。
安装说明取决于你试图安装Supervisor的系统是否具有网络访问权限。
可以使用pip install
安装Supervisor:
pip install supervisor
取决于系统的Python的权限,你可能需要成为root用户才能使用pip
成功安装Supervisor。
你还可以通过pip
在虚拟环境中安装supervisor。
如果你的系统未安装pip
,则需要下载Supervisor发行版并手动安装。当前和以前的Supervisor版本可以从PyPi下载。解压缩软件存档后,运行python setup.py install
。这需要互联网访问。它将下载并安装Supervisor依赖的所有发行版,最后安装Supervisor本身。
注意:
取决于系统的Python的权限,你可能需要成为root用户才能成功调用python setup.py install
。
如果你想安装Supervisor的系统没有网络访问权限,则你需要以稍微不同的方式执行安装。由于pip
和python setup.py install
都依赖于网络访问来执行依赖软件的下载,因此在安装依赖项之前,这两种方法都不能在没有网络访问的机器上工作。要安装到未联网的机器上,获得对已联网的机器的以下依赖关系:
将这些文件复制到可移动介质,然后将它们放在目标计算机上。按照说明将它们分别安装到目标计算机上。这通常仅意味着解压缩每个文件并在解压目录中调用python setup.py install
。最后,运行supervisor的python setup.py install
。
注意:
取决于系统的Python的权限,你可能需要成为root用户才能成功为每个包调用python setup.py install
。
一些Linux发行版提供了可通过系统包管理器安装的Supervisor版本。这些包是由第三方(而非Supervisor开发人员)制作的,并且通常包括针对Supervisor的特定于发行版的更改。
使用发行版的包管理工具来检查可用性;例如,在Ubuntu上,你可以运行apt-cache show supervisor
,在CentOS上,你可以运行yum info supervisor
。
Supervisor发行包的一个特性是,它们通常将集成到分发的服务管理基础架构中,例如,允许supervisord
在系统启动时自动启动。
注意:
Supervisor的发行包可能远远落后于发布到PyPI的官方Supervisor包。例如,Ubuntu 12.04(2012年4月发布)提供了基于Supervisor 3.0a8(2010年1月发布)的包。
注意:
用户反映,适用于Ubuntu 16.04的Supervisor发行包的行为与以前的版本不同。在Ubuntu 10.04、12.04和14.04上,安装包会将系统配置为在系统启动时启动supervisord
。在Ubuntu 16.04上,该包的初始发行版并未做到这一点。该包后来被修复。有关更多信息,请参见Ubuntu Bug #1594740。
Supervisor安装完成后,运行echo_supervisord_conf
。这会将“示例”Supervisor配置文件打印到终端的标准输出。
一旦看到文件回显到终端,请以echo_supervisord_conf > /etc/supervisord.conf
重新调用命令。如果你没有root访问权限,则此操作将无效。
如果你没有root访问权限,或者你不希望将supervisord.conf
文件放在/etc/supervisord.conf
中,则可以将其放置在当前目录(echo_supervisord_conf > supervisord.conf
)中,并使用-c
标志启动supervisord以指定配置文件位置。
例如,supervisord -c supervisord.conf
。在这种情况下,使用-c
标志实际上是多余的,因为supervisord在搜索任何其它位置的文件之前会先在当前目录中搜索supervisord.conf
,但是它会起作用。有关-c
标志的更多信息,请参见3.运行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
的输出。
要使supervisord对你有所帮助,你需要在其配置中至少添加一个program
部分。program
部分将定义一个在调用supervisord命令时运行和管理的程序。要添加程序,你需要编辑supervisord.conf
文件。
UNIX cat
程序是可能运行的最简单的程序之一。下面显示了在supervisord进程启动时将运行cat
的program
部分。
[program:foo]
command=/bin/cat
该节可以被剪切并粘贴到supervisord.conf
文件中。这是最简单的程序配置,因为它仅命名一个命令。程序配置部分还有许多其它配置选项,此处未显示。有关更多信息,请参见4.6[program:x]设置。
要启动supervisord,请运行$BINDIR/supervisord
。生成的进程将自身守护进程并与终端分离。默认情况下,它会将操作日志保留在$CWD/supervisor.log
中。
你可以通过在命令行中传递-n
标志来在前台启动可执行的supervisord。这对于调试启动问题很有用。
警告:
当supervisord启动时,它将在默认位置(包括当前工作目录)搜索其配置文件。如果你注重安全性,则可能需要在supervisord命令后指定“ -c”参数,以指定配置文件的绝对路径,以确保不会有人诱骗你从包含流氓
supervisord.conf
文件的目录中运行supervisor。当supervisor以root身份启动而没有此-c
参数时,将发出警告。
要更改受supervisord控制的程序集,请编辑supervisord.conf
文件并kill -HUP
或以其它方式重新启动supervisord进程。该文件具有几个示例程序定义。
supervisord命令接受许多命令行选项。这些命令行选项中的每个选项都会覆盖配置文件中的任何等效值。
命令 | 描述 |
---|---|
-c FILE, --configuration=FILE | supervisord配置文件的路径 |
-n, --nodaemon | 在前台运行supervisord |
-s, --silent | 没有指向到stdout的输出 |
-h, --help | 显示supervisord命令行帮助 |
-u USER, --user=USER | UNIX用户名或数字用户标识。如果supervisord以root用户启动,在启动过程中尽快对此用户setuid。 |
-m OCTAL, --umask=OCTAL | 代表supervisord启动后应使用的umask的八进制数字(例如022)。 |
-d PATH, --directory=PATH | 当supervisord作为守护进程运行时,在守护进程运行之前,cd到该目录。 |
-l FILE, --logfile=FILE | 用作supervisord活动日志的文件名路径。 |
-y BYTES, --logfile_maxbytes=BYTES | 轮换发生之前,supervisord活动日志文件的最大大小。该值后缀相乘,例如“1”是一个字节,“1MB”是1兆字节,“1GB”是1千兆字节。 |
-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在分析器下运行,并基于选项输出结果,这些选项是逗号分隔的以下列表:cumulative , calls , callers 。例如cumulative,callers 。 |
–minprocs=NUM | 成功启动supervisord进程之前,其必须可用的最小OS进程插槽数目。 |
要启动supervisorctl,运行$BINDIR/supervisorctl
。将显示一个shell,允许你控制当前由supervisord管理的进程。在提示符下键入“help”以获取有关受支持的命令的信息。
当从命令行使用参数调用supervisorctl可执行文件时,可以使用“一次性”命令来调用。例如:supervisorctl stop all
。如果命令行中存在参数,则将阻止交互式shell的调用。相反,该命令将被执行,supervisorctl
将退出,以0表示成功或正在运行,而非零表示错误。例如:如果任何单个进程没有在运行,supervisorctl status all
将返回非零。
如果在交互模式下对需要身份验证的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”查找可用操作。
命令 | 描述 |
---|---|
help | 打印可用操作列表 |
help |
打印 的帮助 |
add |
激活进程/组配置中的任何更新 |
remove |
从活动配置中删除进程/组 |
update | 重新加载配置并根据需要添加/删除,并将重新启动受影响的程序 |
update all | 重新加载配置并根据需要添加/删除,并将重新启动受影响的程序 |
update |
更新特定的组,并将重新启动受影响的程序 |
clear |
清除进程的日志文件。 |
clear |
清除多个进程的日志文件 |
clear all | 清除所有进程的日志文件 |
fg |
在前台模式下连接到进程按Ctrl+C退出前台 |
pid | 获取supervisord的PID |
pid |
通过名称获取单个子进程的PID |
pid all | 获取每个子进程的PID,每行一个 |
reload | 重新启动远程supervisord |
reread | 重新加载守护进程的配置文件,而不添加/删除(不重新启动) |
restart |
重新启动进程注意:重新启动不会重新读取配置文件。为此,请参阅reread和update |
restart |
重新启动组中的所有进程注意:重新启动不会重新读取配置文件。为此,请参阅reread和update |
restart |
重新启动多个进程或组注意:重新启动不会重新读取配置文件。为此,请参阅reread和update |
restart all | 重新启动所有进程注意:重新启动不会重新读取配置文件。为此,请参阅reread和update |
signal | 没有帮助的信号 |
start |
启动一个进程 |
start |
启动组中的所有进程 |
start |
启动多个进程或组 |
start all | 启动所有进程 |
status | 获取所有进程状态信息 |
status |
通过名称获取单个进程的状态 |
status |
获取多个命名进程的状态 |
stop |
停止一个进程 |
stop |
停止组中的所有进程 |
stop |
停止多个进程或组 |
stop all | 停止所有进程 |
tail [-f] |
输出进程日志的最后部分,例如:tail -f 命名进程连续在尾部stdout,Ctrl+C退出。tail -100 进程的最后100个字节stdout;tail 进程的最后1600个字节stderr |
supervisord程序可能会被发送信号,导致其在运行时执行某些操作。
你可以将任何这些信号发送到单个supervisord进程ID。此进程ID可以在配置文件的[supervisord]
部分的pidfile
参数表示的文件中找到(默认为$CWD/supervisord.pid
)。
信号 | 描述 |
---|---|
SIGTERM |
supervisord及其所有子进程将关闭。这可能需要几秒钟。 |
SIGINT |
supervisord及其所有子进程将关闭。这可能需要几秒钟。 |
SIGQUIT |
supervisord及其所有子进程将关闭。这可能需要几秒钟。 |
SIGHUP |
supervisord将停止所有进程,从找到的第一个配置文件中重新加载配置,并启动所有进程。 |
SIGUSR2 |
supervisord将关闭并重新打开主活动日志和所有子日志文件。 |
开发人员已尽最大努力确保使用以root身份运行的supervisord进程不会导致意外的权限升级。但是使用者自慎。Supervisor不像DJ Bernstein的daemontools那样偏执,因为supervisord允许在其配置文件中写入任意路径规范。允许选择任意路径会导致符号链接攻击产生漏洞。在配置中指定路径时要小心。确保无权限用户无法读取或写入supervisord配置文件,并且由supervisor程序包安装的所有文件都具有“合理的”文件权限保护设置。此外,请确保你的PYTHONPATH
合理,并且所有Python标准库文件都具有足够的文件权限保护。
如果你使用的是发行版打包的Supervisor,则应该已经将其集成到发行版的服务管理基础结构中。
以下是用户贡献的各种操作系统的脚本:
https://github.com/Supervisor/initscripts
万一你遇到麻烦,Serverfault上有一些答案:如何在Linux(Ubuntu)上自动启动supervisord
Supervisor配置文件通常被命名为supervisord.conf
。supervisord和supervisorctl都使用它。如果在没有-c
选项的情况下启动了任何一个应用程序(该选项用于显式告知应用程序配置文件名),则该应用程序将在以下位置按指定顺序查找名为supervisord.conf
的文件。它将使用找到的第一个文件。
../etc/supervisord.conf
(相对于可执行文件,例/usr/etc/supervisord.conf
)../supervisord.conf
(相对于可执行文件,例/usr/supervisord.conf
)$CWD/supervisord.conf
$CWD/etc/supervisord.conf
/etc/supervisord.conf
/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
在配置文件中使用:
[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将在UNIX域套接字上侦听HTTP/XML-RPC请求的路径。supervisorctl使用XML-RPC通过该端口与supervisord通信。此选项可以包含值%(here)s
,该值将扩展到找到supervisord配置文件的目录。
默认值:无。
必填:否。
介绍: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-1哈希(如果以字符串{SHA}
为前缀)。例如,{SHA} 82ab876d1387bfafe46cc1c8a2ef074eae50cb1d
是密码“thepassword”的SHA存储版本。
注意,哈希密码必须为十六进制格式。
默认值:无需密码。
必填:否。
介绍:3.0
[unix_http_server]
示例[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(internet)套接字的HTTP服务的配置参数。如果配置文件没有[inet_http_server]
部分,则不会启动inet HTTP服务。允许的配置值如下。
警告:
默认情况下,未启用inet HTTP服务。如果选择启用它,请阅读以下安全警告。inet HTTP服务仅在受信任的环境中使用。它只应绑定到localhost或只能从隔离的、受信任的网络中访问。inet HTTP服务不支持任何形式的加密。默认情况下,inet HTTP服务不使用身份验证(请参阅username=
和password=
选项)。可以从supervisorctl远程控制Inet HTTP服务。它还提供了一个Web界面,该界面允许启动或停止子进程以及查看子进程日志。切勿将inet HTTP服务暴露给公网。
[inet_http_server]
值port
TCP host:port值(例如127.0.0.1:9001
),supervisor将在该值上监听HTTP/XML-RPC请求。supervisorctl将使用XML-RPC通过此端口与supervisord通信。要监听机器中的所有接口,请使用:9001
或*:9001
。请阅读上面的安全警告。
默认值:无默认值。
必填:是。
介绍:3.0
username
对此HTTP服务进行身份验证所需的用户名。
默认值:无需用户名。
必填:否。
介绍:3.0
password
对此HTTP服务进行身份验证所需的密码。这可以是明文密码,也可以指定为SHA-1哈希(如果以字符串{SHA}
为前缀)。例如,{SHA} 82ab876d1387bfafe46cc1c8a2ef074eae50cb1d
是密码“thepassword”的SHA存储版本。
注意,哈希密码必须为十六进制格式。
默认值:无需密码。
必填:否。
介绍:3.0
[inet_http_server]
示例[inet_http_server]
port = 127.0.0.1:9001
username = user
password = 123
[supervisord]
设置supervisord.conf
文件包含名为[supervisord]
的部分,应在其中插入与supervisord进程相关的全局设置。具体如下。
[supervisord]
值logfile
supervisord进程的活动日志的路径。此选项可以包含值%(here)s
,该值将扩展到找到supervisord配置文件的目录。
注意:
如果将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活动日志的内容。critical
、error
、warn
、info
、debug
、trace
或blather
之一。注意,在日志级别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,则supervisor将在前台启动而不是以守护进程。
默认值:false。
必填:否。
介绍:3.0
silent
如果为true且未被守护,则日志将不会定向到stdout。
默认值:false。
必填:否。
介绍:4.2.0
minfds
成功启动supervisord之前必须可用的文件描述符的最小数目。将调用setrlimit尝试提高supervisord进程的软限制和硬限制,以满足minfds
。仅当supervisord以root身份运行时,才可以提高硬限制。supervisord不受限制地使用文件描述符,当无法从操作系统获得文件描述符时,它将进入故障模式,因此能够指定最小值以确保在执行期间不会耗尽它们是很有用的。这些限制将由托管子进程继承。此选项在Solaris上特别有用,因为Solaris默认情况下每个进程的fd限制较低。
默认值:1024。
必填:否。
介绍:3.0
minprocs
成功启动supervisord之前必须可用的进程描述符的最小数目。将调用setrlimit尝试提高supervisord进程的软限制和硬限制,以满足minprocs
。仅当supervisord以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用户帐户。如果以root用户身份启动supervisord,才能切换用户。
默认值:不切换用户。
必填:否。
介绍:3.0
已更改:3.3.4。如果supervisord无法切换到指定的用户,它将向stderr
写入一条错误消息,然后立即退出。在早期版本中,它将继续运行,但会在critical
级别记录一条消息。
directory
当supervisord守护进程时,切换到该目录。此选项可以包含值%(here)s
,该值将扩展到找到supervisord配置文件的目录。
默认值:不cd。
必填:否。
介绍: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的shell的环境变量,但此处和程序的environment
选项中重写的变量除外。请参阅子进程环境。
默认值:无值。
必填:否。
介绍:3.0
identifier
RPC接口使用的此supervisor进程的标识符字符串。
默认值:supervisor。
必填:否。
介绍:3.0
[supervisord]
示例[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交互式shell程序的设置。下面列出了这些选项。
[supervisorctl]
值serverurl
用于访问supervisord服务的URL,例如http://localhost:9001
。对于UNIX域套接字,使用unix:///absolute/path/to/file.sock
。
默认值:http://localhost:9001
。
必填:否。
介绍:3.0
username
传递给supervisord服务以进行身份验证的用户名。该名称应与你试图访问的端口或UNIX域套接字的supervisord服务配置中的username
相同。
默认值:无用户名。
必填:否。
介绍:3.0
password
传递给supervisord服务以进行身份验证的密码。这应该是你要访问的端口或UNIX域套接字的supervisord服务配置中password
的明文版本。该值不能作为SHA哈希传递。与该文件中指定的其它密码不同,它必须以明文形式提供。
默认值:无密码。
必填:否。
介绍:3.0
prompt
用作supervisorctl提示的字符串。
默认值:supervisor
。
必填:否。
介绍:3.0
history_file
用作readline
永久历史记录文件的路径。如果通过选择路径启用此功能,则你的supervisorctl命令将保留在文件中,并且你可以使用readline(例如,向上箭头)来调用你在上一个supervisorctl会话中执行的命令。
默认值:无文件。
必填:否。
介绍:3.0a5
[supervisorctl]
示例[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版开始)。该组的成员由配置中numprocs
和process_name
参数的组合定义。默认情况下,如果numprocs和process_name保持默认值不变,则[program:x]
表示的组将被命名为x
,并且其中将包含名为x
的单个进程。这提供了与较早的supervisor版本的向后兼容性,该版本不将程序部分视为同类的进程组定义。
但是,例如,如果你有一个[program:foo]
部分,其numprocs
为3,并且process_name
表达式为%(program_name)s_%(process_num)02d
,则“foo”组将包含三个进程,名为foo_00
、foo_01
和foo_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_name
、host_node_name
、program_name
、process_num
、numprocs
、here
(supervisord配置文件的目录),以及所有supervisord的环境变量以ENV_
开头)的字典计算的。受控程序本身不应该是守护程序,因为supervisord假设它负责守护其子进程(请参阅子进程的Nondaemonization)。
注意:
如果该命令看起来像一个配置文件注释,则将被截断。例如,command=bash -c 'foo ; bar'
将被截断为command=bash -c 'foo
。引号不会阻止此行为,因为配置文件读取器不会像shell那样解析命令。
默认值:无默认。
必填:是。
介绍:3.0
已更改:4.2.0。添加了对numprocs
扩展的支持。
process_name
一个Python字符串表达式,用于组成该进程的supervisor进程名称。除非你更改numproc
,否则通常无需担心设置此配置。将根据包含 group_name
、host_node_name
、process_num
、program_name
和here
(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
在放弃并使进程进入FATAL
状态之前,尝试启动程序时,supervisord将允许的串行失败尝试次数。有关FATAL
状态的说明,请参见进程状态。
默认值:3。
必填:否。
介绍:3.0
autorestart
指定当supervisord处于RUNNING
状态时,如果退出是否应自动重启该进程。可能是false
、unexpected
或true
的其中之一。如果为false
,则该进程将不会自动重新启动。如果为unexpected
,当程序退出时,退出代码不是与此进程的配置相关的退出代码之一(请参见exitcodes
),则该进程将重新启动。如果为true
,则退出时该进程将无条件重新启动,而不考虑其退出代码。
注意:
autorestart
控制程序如果在成功启动后退出(进程处于RUNNING
状态),supervisord是否会自动重启程序。
进程启动时(进程处于STARTING
状态),supervisord具有不同的重启机制。进程启动期间的重试由startsecs
和startretries
控制。
默认值:unexpected。
必填:否。
介绍:3.0
exitcodes
与autorestart
一起使用的该程序的“预期”退出代码列表。如果将autorestart
参数设置为unexpected
,并且该进程以除supervisor停止请求之外的任何其他方式退出,则如果该进程退出且退出代码未在此列表中定义,则supervisord将重新启动该进程。
默认值:0。
必填:否。
介绍:3.0
注意:
在4.0之前的Supervisor版本中,默认值为0,2
。在Supervisor 4.0中,默认设置已更改为0。
stopsignal
请求停止时用于终止程序的信号。可以是TERM、HUP、INT、QUIT、KILL、USR1或USR2中的任何一个。
默认值:TERM。
必填:否。
介绍:3.0
stopwaitsecs
在向程序发送停止信号后,等待操作系统将SIGCHLD返回给supervisord的秒数。如果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,也不会更改USER
或HOME
之类的环境变量。有关详细信息,请参见子进程环境。
默认值:不切换用户。
必填:否。
介绍:3.0
redirect_stderr
如果为true,则将进程的stderr输出发送回其stdout文件描述符上的supervisord(以UNIX Shell术语来说,这等效于执行/the/program 2>&1
)。
注意:
不要在[eventlistener:x]
部分中设置redirect_stderr=true
。事件监听器Eventlisteners使用stdout
和stdin
与supervisord
进行通信。如果重定向stderr
,则stderr
的输出将干扰eventlistener协议。
默认值:false。
必填:否。
介绍:3.0,取代2.0的log_stdout
和log_stderr
stdout_logfile
将进程stdout输出放入此文件中(如果redirect_stderr为true,也将stderr输出放入该文件中)。如果未设置stdout_logfile
或将其设置为AUTO
,则supervisor将自动选择文件位置。如果将其设置为NONE
,则supervisord将不会创建任何日志文件。supervisord重启时,将删除AUTO
日志文件及其备份。stdout_logfile
值可以包含Python字符串表达式,该表达式将针对包含键group_name
、host_node_name
、process_num
、program_name
和here
(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捕获模式”时,写入捕获FIFO的最大字节数(请参阅捕获模式)。应为整数(值中可以使用后缀乘数,例如“KB”,“MB”和“GB”)。如果该值为0,则进程捕获模式将关闭。
默认值:0。
必填:否。
介绍:3.0
stdout_events_enabled
如果为true,则在进程写入其stdout文件描述符时将发出PROCESS_LOG_STDOUT
事件。仅当接收到数据时文件描述符未处于捕获模式时才会发出事件(请参阅捕获模式)。
默认值: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捕获模式”时,写入捕获FIFO的最大字节数(请参阅捕获模式)。应为整数(值中可以使用后缀乘数,例如“KB”,“MB”和“GB”)。如果该值为0,则进程捕获模式将关闭。
默认值:0。
必填:否。
介绍:3.0
stderr_events_enabled
如果为true,则在进程写入其stderr文件描述符时将发出PROCESS_LOG_STDERR
事件。仅当接收到数据时文件描述符未处于捕获模式时才会发出事件(请参阅捕获模式)。
默认值:false。
必填:否。
介绍:3.0a7
stderr_syslog
如果为true,stderr将与进程名称一起定向到syslog。
默认值:False。
必填:否。
介绍:4.0.0
environment
格式为KEY="val",KEY2="val2"
的键/值对的列表,该键/值对将放置在子进程的环境中。环境字符串可能包含Python字符串表达式,将根据包含group_name
、host_node_name
、process_num
、program_name
和here
(supervisord配置文件的目录)的字典对Python字符串表达式进行计算。包含非字母数字字符的值应加引号(例如KEY="val:123",KEY2="val,456"
)。否则,引号值是可选的,但建议使用。注意,子进程将继承用于启动“supervisord”的shell的环境变量,但此处重写的变量除外。请参阅子进程环境。
默认值:无额外环境。
必填:否。
介绍:3.0
directory
代表目录的文件路径,supervisord在执行子级之前应暂时将目录chdir。
默认值:不chdir(继承supervisor的)。
必填:否。
介绍:3.0
umask
代表该进程的umask的八进制数字(例如002、022)。
默认值:无特殊umask(继承supervisor的)。
必填:否。
介绍:3.0
serverurl
在环境中作为SUPERVISOR_SERVER_URL
(请参见supervisor.childutils)传递给子进程的进程的URL,以使子进程可以轻松地与内部HTTP服务通信。如果提供的话,它应该与具有相同名称的[supervisorctl]
部分选项具有相同的语法和结构。如果将其设置为AUTO或未设置,则supervisor将自动构造服务URL,优先选择在UNIX域套接字上监听的服务,而不是在Internet套接字上监听的服务。
默认值:AUTO。
必填:否。
介绍:3.0
[program:x]
示例[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
以空格分隔的文件glob序列。每个文件glob可以是绝对的也可以是相对的。如果文件glob是相对的,则认为它是相对于包含它的配置文件的位置。“glob”是一种文件模式,它根据Unix shell使用的规则与指定的模式匹配。没有波浪符号~
扩展,但是*
、?
和用[]
表示的字符范围将正确匹配。字符串表达式是根据包含host_node_name
以及here
(supervisord配置文件的目录)的字典计算的。不支持来自包含文件中的递归包含。
默认值:无默认值(必填)。
必填:是。
介绍:3.0
已更改:3.3.0。添加了对host_node_name
扩展的支持。
[include]
示例[include]
files = /an/absolute/filename.conf /an/absolute/*.conf foo.conf config??.conf
[group:x]
设置将“同类”进程组(也称为“程序”)分组为“异类”进程组通常很有用,这样就可以从Supervisor的各种控制器界面中将它们作为一个单元进行控制。
要将程序放入一个组中以便可以将它们视为一个单元,请在配置文件中定义一个[group:x]
部分。组头值是一个复合值。它是“group”一词,紧接着是冒号,然后是组名。头值[group:foo]
描述了一个名称为“foo”的组。该名称用于控制该配置所创建的进程的客户端应用程序中。创建没有名称的组部分是错误的。名称中不得包含冒号或括号字符。
对[group:x]
,配置文件中的其它位置必须有一个或多个[group:x]
部分,并且该组必须在programs
值中按名称引用它们。
如果通过[group:x]
部分的programs
行将“同类”过程组(由程序部分表示)放入“异类”组中,则该程序部分所隐含的同类组在运行时不会在supervisor中存在。相反,而是将属于每个同类组的所有进程放入异类组。例如,给定以下组配置:
[group:foo]
programs=bar,baz
priority=999
鉴于以上所述,在supervisord启动时,bar
和baz
同类组将不存在,并且原本属于它们的进程现在将移入foo
组。
[group:x]
值programs
程序名称的逗号分隔列表。列出的程序成为该组的成员。
默认值:无默认值(必填)。
必填:是。
介绍:3.0
priority
类似于分配给该组的[program:x]
优先级值的优先级数。
默认值:999。
必填:否。
介绍:3.0
[group:x]
示例[group:foo]
programs=bar,baz
priority=999
[fcgi-program:x]
设置Supervisor可以管理所有在同一套接字上监听的FastCGI进程组。到目前为止,FastCGI的部署灵活性有限。为了获得全面的进程管理,你可以在Apache下使用mod_fastcgi,但随后便陷入了Apache低效的并发模型,即每个连接一个进程或线程。除了需要更多的CPU和内存资源外,每个连接模型的进程/线程可能会因资源缓慢而很快饱和,从而阻止了其它资源的使用。为了利用更新的事件驱动的Web服务(例如lighttpd或nginx),它们不包含内置的进程管理器,你必须使用cgi-fcgi或spawn-fcgi之类的脚本。这些可以与进程管理器(例如supervisord或daemontools)结合使用,但需要每个FastCGI子进程绑定到其自己的套接字。这样做的缺点是:不必要的复杂Web服务配置,不必要的重启以及降低的容错能力。如果FastCGI进程组可以共享套接字,那么配置的套接字较少,Web服务配置就越小。共享套接字允许正常重启,因为在任何子进程正在重启时,套接字仍受父进程绑定。最后,共享套接字具有更高的容错能力,因为如果给定进程失败,则其它进程可以继续为入站连接提供服务。
借助集成的FastCGI生成支持,Supervisor为你提供了两全其美的解决方案。你可以通过共享套接字的FastCGI进程组获得全功能的进程管理,而不必绑定到特定的Web服务。这是一个明确的关注点分离,允许网络服务和进程管理器各自尽其所能。
注意:
Supervisor中的套接字管理器最初是为支持FastCGI进程而开发的,但不仅限于FastCGI。无需特殊配置,也可以使用其它协议。可以从文件描述符访问打开的套接字的任何程序(例如,在Python中使用socket.fromfd)都可以使用套接字管理器。Supervisor将在组中派生的第一个子代之前自动创建套接字,绑定和监听。套接字将通过文件描述符编号0
(零)传递给每个子代。当组中的最后子代退出时,Supervisor将关闭套接字。
注意:
在Supervisor 3.4.0之前,不能在组([group:x]
)中引用FastCGI程序([fcgi-program:x]
)。
fcgi-program
部分也遵守[program:x]
部分的所有可用选项。
[fcgi-program:x]
值[fcgi-program:x]
部分有一些[program:x]
部分所没有的键。
socket
此程序的FastCGI套接字、TCP或UNIX域套接字。对于TCP套接字,请使用以下格式:tcp://localhost:9002
。对于UNIX域套接字,请使用unix:///absolute/path/to/file.sock
。字符串表达式根据包含键“program_name”和“here”(supervisord配置文件的目录)的字典进行计算。
默认值:无默认值。
必填:是。
介绍:3.0
socket_backlog
设置套接字监听(2)积压。
默认值:socket.SOMAXCONN。
必填:否。
介绍:3.4.0
socket_owner
对于UNIX域套接字,此参数可用于指定FastCGI套接字的用户和组。可以是UNIX用户名(例如chrism)或以冒号分隔的UNIX用户名和组(例如chrism:wheel)。
默认值:使用为fcgi-program设置的用户和组。
必填:否。
介绍:3.0
socket_mode
对于UNIX域套接字,此参数可用于指定权限模式。
默认值:0700。
必填:否。
介绍:3.0
有关其它允许的键,请参考4.6[program:x]设置,增量上述约束和补充。
[fcgi-program:x]
示例[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的事件系统接收并响应事件通知的进程。有关事件如何工作以及如何实现可以声明为事件监听器的程序的说明,请参见事件。
注意,eventlistener部分会遵守[program:x]
部分的所有可用选项,但stdout_capture_maxbytes
除外。事件侦听器不能在stdout
上发出进程通信事件,但可以在stderr
上发出(请参阅捕获模式)。
[eventlistener:x]
值[eventlistener:x]
部分中有一些[program:x]
部分所没有的键。
buffer_size
事件监听器池的事件队列缓冲区大小。当监听器池的事件缓冲区溢出时(例如,事件监听器池无法跟上发送给它的所有事件的情况时,会发生这种情况),该缓冲区中最早的事件将被丢弃。
events
以逗号分隔的事件类型名称列表,此监听器在接收通知时对此"感兴趣",(有效事件类型名称的列表,请参阅事件类型)。
result_handler
一个pkg_resources入口点字符串,可解析为可调用的Python。缺省值是supervisor.dispatchers:default_handler
。指定备用结果处理程序是一件非常不常见的事情,因此,如何创建一个结果处理程序没有文档记录。
有关其它允许的键,请参考4.6[program:x]设置,增量上述约束和补充。
[eventlistener:x]
示例[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
设置仅对希望通过其它自定义行为扩展supervisor的用户有用。
在示例配置文件中,有一个名为[rpcinterface:supervisor]
的部分。默认情况下,如下所示。
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[rpcinterface:supervisor]
部分必须保留在配置中,以使supervisor的标准设置正常运行。如果你不希望supervisor做任何开箱即用的事情,这就是你需要了解的有关此类型部分的全部信息。
但是,如果希望添加rpc接口命名空间以自定义supervisor,则可以添加附加的[rpcinterface:foo]
部分,其中“foo”代表接口的命名空间(从Web根目录开始),supervisor.rpcinterface_factory
命名的是一个工厂可调用的值,它应具有一个函数签名,该函数签名接受一个单位置参数supervisord
和执行配置所需的任意多个关键字参数。在[rpcinterface:x]
部分中定义的所有额外键/值对将作为关键字参数传递给工厂。
以下是在Python包my.package
的__init__.py
文件中创建的工厂函数示例。
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
配置文件中的一部分用于配置它。
[rpcinterface:another]
supervisor.rpcinterface_factory = my.package:make_another_rpcinterface
retries = 1
[rpcinterface:x]
值supervisor.rpcinterface_factory
pkg_resources
将“entry point”点名命名为RPC接口的工厂函数。
默认值:N/A。
必填:否。
介绍:3.0
[rpcinterface:x]
示例[rpcinterface:another]
supervisor.rpcinterface_factory = my.package:make_another_rpcinterface
retries = 1
本文参考:
centos-systemd-etcs
centos7安装yum安装pip
systemd-Unit
Linux自动启动supervisord
supervisord官网