文章目录

  • 0.使用Supervisor
    • 0.1安装
    • 0.2配置supervisord.conf
    • 0.3启动supervisord
    • 0.4启动Elasticsearch
    • 0.5启动Kibana
    • 0.6启动Redis
    • 0.7启动RedisInsight
    • 0.8访问Web UI
    • 0.9开机启动supervisord
    • 0.10常用命令
  • 1.介绍
    • 1.1概述
      • 1.1.1方便
      • 1.1.2准确性
      • 1.1.3委托
      • 1.1.4进程组
    • 1.2特性
      • 1.2.1简单
      • 1.2.2集中
      • 1.2.3高效的
      • 1.2.4可扩展的
      • 1.2.5兼容性
      • 1.2.6久经考验
    • 1.3Supervisor组件
      • 1.3.1**supervisord**
      • 1.3.2**supervisorctl**
      • 1.3.3网络服务
      • 1.3.4XML-RPC接口
    • 1.4平台要求
  • 2.安装
    • 2.1安装到有网络访问权限的系统
      • 2.1.1使用Pip命令的网络安装
      • 2.1.2没有Pip命令的网络安装
    • 2.2安装到无法访问网络的系统
    • 2.3安装发行包
    • 2.4创建配置文件
  • 3.运行Supervisor
    • 3.1添加程序
    • 3.2运行**supervisord**
      • 3.2.1**supervisord**命令行选项
    • 3.3运行**supervisorctl**
      • 3.3.1**supervisorctl**命令行选项
      • 3.3.2**supervisorctl**操作
    • 3.4信号
      • 3.4.1信号处理
    • 3.5运行时安全
    • 3.6启动时自动启动**supervisord**
  • 4.配置文件
    • 4.1文件格式
      • 4.1.1环境变量
    • 4.2`[unix_http_server]`设置
      • 4.2.1`[unix_http_server]`值
        • 4.2.1.1`file`
        • 4.2.1.2`chmod`
        • 4.2.1.3`chown`
        • 4.2.1.4`username`
        • 4.2.1.5`password`
      • 4.2.2`[unix_http_server]`示例
    • 4.3`[inet_http_server]`设置
      • 4.3.1`[inet_http_server]`值
        • 4.3.1.1`port`
        • 4.3.1.2`username`
        • 4.3.1.3`password`
      • 4.3.2`[inet_http_server]`示例
    • 4.4`[supervisord]`设置
      • 4.4.1`[supervisord]`值
        • 4.4.1.1`logfile`
        • 4.4.1.2`logfile_maxbytes`
        • 4.4.1.3`logfile_backups`
        • 4.4.1.4`loglevel`
        • 4.4.1.5`pidfile`
        • 4.4.1.6`umask`
        • 4.4.1.7`nodaemon`
        • 4.4.1.8`silent`
        • 4.4.1.9`minfds`
        • 4.4.1.10`minprocs`
        • 4.4.1.11`nocleanup`
        • 4.4.1.12`childlogdir`
        • 4.4.1.13`user`
        • 4.4.1.14`directory`
        • 4.4.1.15`strip_ansi`
        • 4.4.1.16`environment`
        • 4.4.1.17`identifier`
      • 4.4.2`[supervisord]`示例
    • 4.5`[supervisorctl]`设置
      • 4.5.1`[supervisorctl]`值
        • 4.5.1.1`serverurl`
        • 4.5.1.2`username`
        • 4.5.1.3`password`
        • 4.5.1.4`prompt`
        • 4.5.1.5`history_file`
      • 4.5.2`[supervisorctl]`示例
    • 4.6`[program:x]`设置
      • 4.6.1`[program:x]`值
        • 4.6.1.1`command`
        • 4.6.1.2`process_name`
        • 4.6.1.3`numprocs`
        • 4.6.1.4`numprocs_start`
        • 4.6.1.5`priority`
        • 4.6.1.6`autostart`
        • 4.6.1.7`startsecs`
        • 4.6.1.8`startretries`
        • 4.6.1.9`autorestart`
        • 4.6.1.10`exitcodes`
        • 4.6.1.11`stopsignal`
        • 4.6.1.12`stopwaitsecs`
        • 4.6.1.13`stopasgroup`
        • 4.6.1.14`killasgroup`
        • 4.6.1.15`user`
        • 4.6.1.16`redirect_stderr`
        • 4.6.1.17`stdout_logfile`
        • 4.6.1.18`stdout_logfile_maxbytes`
        • 4.6.1.19`stdout_logfile_backups`
        • 4.6.1.20`stdout_capture_maxbytes`
        • 4.6.1.21`stdout_events_enabled`
        • 4.6.1.22`stdout_syslog`
        • 4.6.1.23`stderr_logfile`
        • 4.6.1.24`stderr_logfile_maxbytes`
        • 4.6.1.25`stderr_logfile_backups`
        • 4.6.1.26`stderr_capture_maxbytes`
        • 4.6.1.27`stderr_events_enabled`
        • 4.6.1.28`stderr_syslog`
        • 4.6.1.29`environment`
        • 4.6.1.30`directory`
        • 4.6.1.31`umask`
        • 4.6.1.32`serverurl`
      • 4.6.2`[program:x]`示例
    • 4.7`[include]`设置
      • 4.7.1`[include]`值
        • 4.7.1.1`files`
      • 4.7.2`[include]`示例
    • 4.8`[group:x]`设置
      • 4.8.1`[group:x]`值
        • 4.8.1.1`programs`
        • 4.8.1.2`priority`
      • 4.8.2`[group:x]`示例
    • 4.9`[fcgi-program:x]`设置
      • 4.9.1`[fcgi-program:x]`值
        • 4.9.1.1`socket`
        • 4.9.1.2`socket_backlog`
        • 4.9.1.3`socket_owner`
        • 4.9.1.4`socket_mode`
      • 4.9.2`[fcgi-program:x]`示例
    • 4.10`[eventlistener:x]`设置
      • 4.10.1`[eventlistener:x]`值
        • 4.10.1.1`buffer_size`
        • 4.10.1.2`events`
        • 4.10.1.3`result_handler`
      • 4.10.2`[eventlistener:x]`示例
    • 4.11`[rpcinterface:x]`设置
      • 4.11.1`[rpcinterface:x]`值
        • 4.11.1.1`supervisor.rpcinterface_factory`
      • 4.11.2`[rpcinterface:x]`示例

Supervisor:一个进程控制系统
Supervisor是一个客户端/服务系统,允许其用户监控和控制类似UNIX的操作系统上的多个进程。
它具有一些相同的目的的程序,例如launchddaemontoolsrunit。与这些程序中的某些程序不同,它不打算作为“进程ID 1”的替代init运行。相反,它打算用于控制与项目或客户相关的进程,并且打算在启动时像任何其它程序一样启动。

知道你们时间宝贵,看第一节应该就能满足你们的需要。如果想多了解Supervisor的话,比如一些具体配置,可以看后面几节。

0.使用Supervisor

0.1安装

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]$ lldrwxr-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

0.2配置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

0.3启动supervisord

# 启动supervisord
[solang@solang ~]$ supervisord[solang@solang aaa]$ supervisord -v
4.2.0[solang@solang ~]$ cd /usr/local/supervisor-4.2.0/config

0.4启动Elasticsearch

[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.logINFO 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.logwhich: 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 supervisordsolang   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优先启动。

0.5启动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

0.6启动Redis

[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

0.7启动RedisInsight

[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

0.8访问Web UI

浏览器访问http://192.168.86.100:9001/,输入配置的用户名和密码,可管理查看进程的运行状态。

0.9开机启动supervisord

设置服务脚本

[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配置项表示以指定的用户名启动服务;
LimitNOFILELimitNPROC表示文件描述符数和线程数,由于在启动Elasticsearch的时候我们配置了supervisord的最小文件描述符数和最小进程数,所以在启动脚本中一定要加上这两个配置,不然启动不起来(这个问题找了好久才找到解决方式),详细的问题如下所述

[solang@solang ~]$ vi /usr/etc/supervisord.conf[supervisord]
minfds=65536
minprocs=4096

如果没配置LimitNOFILELimitNPROC的话,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 -xesolang 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 -xesolang 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,所以在自启动脚本中指定文件描述符数和进程数后,运行成功了。

0.10常用命令

supervisorctl status                //查看所有进程的状态
supervisorctl stop process_name     //停止
supervisorctl start process_name    //启动
supervisorctl restart process_name  //重启
supervisorctl update                //配置文件修改后使用该命令加载新的配置
supervisorctl reload                //重新启动配置中的所有程序

1.介绍

1.1概述

Supervisor是一个客户端/服务系统,允许其用户控制类似UNIX的操作系统上的多个进程。它受到以下方面的启发:

1.1.1方便

需要为每个单进程实例编写rc.d脚本通常很不方便。rc.d脚本是进程初始化/自动启动/管理的一个很好的最基本形式,但是编写和维护它们可能很麻烦。此外,rc.d脚本不能自动重新启动崩溃的进程,并且许多程序在崩溃时不能正确地自行重启。Supervisord将进程作为其子进程启动,并且可以配置为在崩溃时自动重新启动它们。它也可以将其自动配置为自行调用启动进程。

1.1.2准确性

在UNIX上,通常很难获得进程准确的启动/关闭状态。Pidfile经常说谎。Supervisord将进程作为子进程启动,因此它始终了解其子进程的真实启动/关闭状态,并且可以方便地查询这些数据。

1.1.3委托

需要控制进程状态的用户通常只需要这样做。他们不想或不需要完整的Shell访问运行这些进程的计算机。监听“低”TCP端口的进程通常需要以root用户(UNIX错误特性)身份启动和重新启动。通常情况下,允许“普通”用户停止或重新启动这样的进程是完全可以的,但是为他们提供shell访问权限通常是不切实际的,并且为他们提供root访问权限或sudo访问权限通常是不可能的。也很难(正确)向他们解释为什么存在此问题。如果supervisord是以root用户身份启动的,则可以允许“普通”用户控制此类进程,而无需向他们解释问题的复杂性。Supervisorctl允许以非常有限的方式访问计算机,实质上是允许用户通过从简单的Shell或Web UI发出“stop”、“start”和“restart”命令来查看进程状态并控制受supervisord监督的子进程。

1.1.4进程组

进程通常需要以组的形式启动和停止,有时甚至需要按照“优先级顺序”进行。通常很难向人们解释如何做。Supervisor允许你为进程分配优先级,并允许用户通过supervisorctl客户端发出命令,如“start all”和“restart all”,这将按照预先分配的优先级顺序启动它们。此外,可以将进程分组到“进程组”中,并且可以将一组逻辑相关的进程作为一个单元停止和启动。

1.2特性

1.2.1简单

Supervisor通过一个简单易学的INI风格配置文件进行配置。它提供了许多每个进程的选项,使你的工作变得更轻松,例如重新启动失败的进程和自动日志轮换。

1.2.2集中

Supervisor为你提供了一个启动、停止和监控进程的地方。进程可以单独或按组控制。你可以配置Supervisor以提供本地或远程命令行和Web界面。

1.2.3高效的

Supervisor通过fork/exec启动其子进程,并且子进程不进行守护进程。进程终止时,操作系统会立即向Supervisor发送信号,这与某些依赖麻烦的PID文件和定期轮询来重新启动失败的进程的解决方案不同。

1.2.4可扩展的

Supervisor具有一个简单的事件通知协议,该协议可以使用任何语言编写的程序对其进行监控,还有一个用于控制的XML-RPC接口。Python开发人员可以利用这些扩展点构建。

1.2.5兼容性

除Windows外,Supervisor几乎适用于所有其它方面。它已在Linux、Mac OS X、Solaris和FreeBSD上经过测试和支持。它完全用Python编写,因此安装不需要C编译器。

1.2.6久经考验

尽管Supervisor如今非常活跃,但它不是新软件。Supervisor已经存在了多年,并且已经在许多服务上使用。

1.3Supervisor组件

1.3.1supervisord

supervisor的服务部分被称为supervisord。它负责自行调用启动子程序,响应来自客户端的命令,重新启动崩溃或退出的子进程,记录其子进程stdoutstderr输出以及生成和处理与子进程生命周期中的点相对应的“事件”。

服务进程使用配置文件。它通常位于/etc/supervisord.conf中。此配置文件是“Windows-INI”风格的配置文件。通过适当的文件系统权限来确保此文件的安全很重要,因为它可能包含未加密的用户名和密码。

1.3.2supervisorctl

supervisor的命令行客户端部分被称为supervisorctl。它为supervisord提供的特性提供了类似于shell的界面。从supervisorctl,用户可以连接到不同的supervisord进程(一次一个),获取由其控制的子进程的状态,停止和启动子进程,以及获取supervisord正在运行的进程列表。

命令行客户端通过UNIX域套接字或Internet(TCP)套接字与服务对话。服务可以断言客户端的用户应在允许客户端执行命令之前出示身份验证凭据。客户端进程通常使用与服务相同的配置文件,但是任何带有[supervisorctl]部分的配置文件都可以工作。

1.3.3网络服务

如果针对Internet套接字启动supervisord,则可以通过浏览器访问功能类似于supervisorctl的(稀疏)Web用户界面。激活配置文件的[inet_http_server]部分后,访问服务URL(例如http://localhost:9001/)以通过Web界面查看和控制进程状态。

1.3.4XML-RPC接口

为Web UI提供服务的同一HTTP服务提供了一个XML-RPC接口,该接口可用于询问和控制supervisor及其运行的程序。请参阅XML-RPC API文档。

1.4平台要求

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上工作。

2.安装

安装说明取决于你试图安装Supervisor的系统是否具有网络访问权限。

2.1安装到有网络访问权限的系统

2.1.1使用Pip命令的网络安装

可以使用pip install安装Supervisor:

pip install supervisor

取决于系统的Python的权限,你可能需要成为root用户才能使用pip成功安装Supervisor。

你还可以通过pip在虚拟环境中安装supervisor。

2.1.2没有Pip命令的网络安装

如果你的系统未安装pip,则需要下载Supervisor发行版并手动安装。当前和以前的Supervisor版本可以从PyPi下载。解压缩软件存档后,运行python setup.py install。这需要互联网访问。它将下载并安装Supervisor依赖的所有发行版,最后安装Supervisor本身。

注意:
取决于系统的Python的权限,你可能需要成为root用户才能成功调用python setup.py install

2.2安装到无法访问网络的系统

如果你想安装Supervisor的系统没有网络访问权限,则你需要以稍微不同的方式执行安装。由于pippython setup.py install都依赖于网络访问来执行依赖软件的下载,因此在安装依赖项之前,这两种方法都不能在没有网络访问的机器上工作。要安装到未联网的机器上,获得对已联网的机器的以下依赖关系:

  • setuptools(最新),来自https://pypi.org/pypi/setuptools/。

将这些文件复制到可移动介质,然后将它们放在目标计算机上。按照说明将它们分别安装到目标计算机上。这通常仅意味着解压缩每个文件并在解压目录中调用python setup.py install。最后,运行supervisor的python setup.py install

注意:
取决于系统的Python的权限,你可能需要成为root用户才能成功为每个包调用python setup.py install

2.3安装发行包

一些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。

2.4创建配置文件

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

在文件系统上拥有配置文件后,你可以根据自己的喜好开始对其进行修改。

3.运行Supervisor

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

3.1添加程序

要使supervisord对你有所帮助,你需要在其配置中至少添加一个program部分。program部分将定义一个在调用supervisord命令时运行和管理的程序。要添加程序,你需要编辑supervisord.conf文件。

UNIX cat程序是可能运行的最简单的程序之一。下面显示了在supervisord进程启动时将运行catprogram部分。

[program:foo]
command=/bin/cat

该节可以被剪切并粘贴到supervisord.conf文件中。这是最简单的程序配置,因为它仅命名一个命令。程序配置部分还有许多其它配置选项,此处未显示。有关更多信息,请参见4.6[program:x]设置

3.2运行supervisord

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

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

警告:

supervisord启动时,它将在默认位置(包括当前工作目录)搜索其配置文件。如果你注重安全性,则可能需要在supervisord命令后指定“ -c”参数,以指定配置文件的绝对路径,以确保不会有人诱骗你从包含流氓supervisord.conf文件的目录中运行supervisor。当supervisor以root身份启动而没有此-c参数时,将发出警告。

要更改受supervisord控制的程序集,请编辑supervisord.conf文件并kill -HUP或以其它方式重新启动supervisord进程。该文件具有几个示例程序定义。

supervisord命令接受许多命令行选项。这些命令行选项中的每个选项都会覆盖配置文件中的任何等效值。

3.2.1supervisord命令行选项

命令 描述
-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应将其写入活动日志的日志记录级别。有效级别为tracedebuginfowarnerrorcritical
-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进程插槽数目。

3.3运行supervisorctl

要启动supervisorctl,运行$BINDIR/supervisorctl。将显示一个shell,允许你控制当前由supervisord管理的进程。在提示符下键入“help”以获取有关受支持的命令的信息。

当从命令行使用参数调用supervisorctl可执行文件时,可以使用“一次性”命令来调用。例如:supervisorctl stop all。如果命令行中存在参数,则将阻止交互式shell的调用。相反,该命令将被执行,supervisorctl将退出,以0表示成功或正在运行,而非零表示错误。例如:如果任何单个进程没有在运行,supervisorctl status all将返回非零。

如果在交互模式下对需要身份验证的supervisord调用supervisorctl,则会要求你提供身份验证凭据。

3.3.1supervisorctl命令行选项

命令 描述
-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”查找可用操作。

3.3.2supervisorctl操作

命令 描述
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 获取supervisord的PID
pid <name> 通过名称获取单个子进程的PID
pid all 获取每个子进程的PID,每行一个
reload 重新启动远程supervisord
reread 重新加载守护进程的配置文件,而不添加/删除(不重新启动)
restart <name> 重新启动进程注意:重新启动不会重新读取配置文件。为此,请参阅reread和update
restart <gname>:* 重新启动组中的所有进程注意:重新启动不会重新读取配置文件。为此,请参阅reread和update
restart <name> <name> 重新启动多个进程或组注意:重新启动不会重新读取配置文件。为此,请参阅reread和update
restart all 重新启动所有进程注意:重新启动不会重新读取配置文件。为此,请参阅reread和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) 输出进程日志的最后部分,例如:tail -f <name>命名进程连续在尾部stdout,Ctrl+C退出。tail -100 <name>进程的最后100个字节stdout;tail <name> stderr进程的最后1600个字节stderr

3.4信号

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

你可以将任何这些信号发送到单个supervisord进程ID。此进程ID可以在配置文件的[supervisord]部分的pidfile参数表示的文件中找到(默认为$CWD/supervisord.pid)。

3.4.1信号处理

信号 描述
SIGTERM supervisord及其所有子进程将关闭。这可能需要几秒钟。
SIGINT supervisord及其所有子进程将关闭。这可能需要几秒钟。
SIGQUIT supervisord及其所有子进程将关闭。这可能需要几秒钟。
SIGHUP supervisord将停止所有进程,从找到的第一个配置文件中重新加载配置,并启动所有进程。
SIGUSR2 supervisord将关闭并重新打开主活动日志和所有子日志文件。

3.5运行时安全

开发人员已尽最大努力确保使用以root身份运行的supervisord进程不会导致意外的权限升级。但是使用者自慎。Supervisor不像DJ Bernstein的daemontools那样偏执,因为supervisord允许在其配置文件中写入任意路径规范。允许选择任意路径会导致符号链接攻击产生漏洞。在配置中指定路径时要小心。确保无权限用户无法读取或写入supervisord配置文件,并且由supervisor程序包安装的所有文件都具有“合理的”文件权限保护设置。此外,请确保你的PYTHONPATH合理,并且所有Python标准库文件都具有足够的文件权限保护。

3.6启动时自动启动supervisord

如果你使用的是发行版打包的Supervisor,则应该已经将其集成到发行版的服务管理基础结构中。

以下是用户贡献的各种操作系统的脚本:

https://github.com/Supervisor/initscripts

万一你遇到麻烦,Serverfault上有一些答案:如何在Linux(Ubuntu)上自动启动supervisord

4.配置文件

Supervisor配置文件通常被命名为supervisord.confsupervisordsupervisorctl都使用它。如果在没有-c选项的情况下启动了任何一个应用程序(该选项用于显式告知应用程序配置文件名),则该应用程序将在以下位置按指定顺序查找名为supervisord.conf的文件。它将使用找到的第一个文件。

  1. ../etc/supervisord.conf (相对于可执行文件,例/usr/etc/supervisord.conf)
  2. ../supervisord.conf (相对于可执行文件,例/usr/supervisord.conf)
  3. $CWD/supervisord.conf
  4. $CWD/etc/supervisord.conf
  5. /etc/supervisord.conf
  6. /etc/supervisor/supervisord.conf (从Supervisor 3.3.0)

注意:
为Debian和Ubuntu打包的许多版本的Supervisor都包含一个补丁,该补丁将/etc/supervisor/supervisord.conf添加到了搜索路径。Supervisor的第一个PyPI软件包包括它是Supervisor 3.3.0。

4.1文件格式

supervisord.conf是一个Windows-INI风格(Python ConfigParser)文件。它具有部分(每个部分由[header]表示)和部分内的键/值对。各部分及其允许值如下所述。

4.1.1环境变量

启动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表达式。在以前的版本中,有些选项支持它们,但大多数不支持。请参阅下面每个选项的文档。

4.2[unix_http_server]设置

supervisord.conf文件包含名为[unix_http_server]的部分,在该部分下应插入在UNIX域套接字上监听的HTTP服务的配置参数。如果配置文件中没有[unix_http_server]部分,则不会启动UNIX域套接字HTTP服务。允许的配置值如下。

4.2.1[unix_http_server]

4.2.1.1file

supervisor将在UNIX域套接字上侦听HTTP/XML-RPC请求的路径。supervisorctl使用XML-RPC通过该端口与supervisord通信。此选项可以包含值%(here)s,该值将扩展到找到supervisord配置文件的目录。

默认值:无。
必填:否。
介绍:3.0

警告:
echo_supervisord_conf输出的示例配置使用/tmp/supervisor.sock作为套接字文件。该路径仅是示例,可能需要将其更改为更适合你的系统的位置。某些系统会定期删除/tmp中的旧文件。如果套接字文件被删除,supervisorctl将无法连接到supervisord

4.2.1.2chmod

在启动时,将UNIX域套接字的UNIX权限模式位更改为该值。

默认值0700
必填:否。
介绍:3.0

4.2.1.3chown

将套接字文件的用户和组更改为此值。可以是UNIX用户名(例如chrism)或以冒号分隔的UNIX用户名和组(例如chrism:wheel)。

默认值:使用启动supervisord的用户名和用户组。
必填:否。
介绍:3.0

4.2.1.4username

对此HTTP服务进行身份验证所需的用户名。

默认值:无需用户名。
必填:否。
介绍:3.0

4.2.1.5password

对此HTTP服务进行身份验证所需的密码。这可以是明文密码,也可以指定为SHA-1哈希(如果以字符串{SHA}为前缀)。例如,{SHA} 82ab876d1387bfafe46cc1c8a2ef074eae50cb1d是密码“thepassword”的SHA存储版本。

注意,哈希密码必须为十六进制格式。

默认值:无需密码。
必填:否。
介绍:3.0

4.2.2[unix_http_server]示例

[unix_http_server]
file = /tmp/supervisor.sock
chmod = 0777
chown= nobody:nogroup
username = user
password = 123

4.3[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服务暴露给公网。

4.3.1[inet_http_server]

4.3.1.1port

TCP host:port值(例如127.0.0.1:9001),supervisor将在该值上监听HTTP/XML-RPC请求。supervisorctl将使用XML-RPC通过此端口与supervisord通信。要监听机器中的所有接口,请使用:9001*:9001。请阅读上面的安全警告。

默认值:无默认值。
必填:是。
介绍:3.0

4.3.1.2username

对此HTTP服务进行身份验证所需的用户名。

默认值:无需用户名。
必填:否。
介绍:3.0

4.3.1.3password

对此HTTP服务进行身份验证所需的密码。这可以是明文密码,也可以指定为SHA-1哈希(如果以字符串{SHA}为前缀)。例如,{SHA} 82ab876d1387bfafe46cc1c8a2ef074eae50cb1d是密码“thepassword”的SHA存储版本。

注意,哈希密码必须为十六进制格式。

默认值:无需密码。
必填:否。
介绍:3.0

4.3.2[inet_http_server]示例

[inet_http_server]
port = 127.0.0.1:9001
username = user
password = 123

4.4[supervisord]设置

supervisord.conf文件包含名为[supervisord]的部分,应在其中插入与supervisord进程相关的全局设置。具体如下。

4.4.1[supervisord]

4.4.1.1logfile

supervisord进程的活动日志的路径。此选项可以包含值%(here)s,该值将扩展到找到supervisord配置文件的目录。

注意:
如果将logfile设置为不可查看的特殊文件(如/dev/stdout),则必须通过设置logfile_maxbytes = 0来禁用日志轮换。

默认值$CWD/supervisord.log
必填:否。
介绍:3.0

4.4.1.2logfile_maxbytes

活动日志文件在轮换之前可能消耗的最大字节数(值中可以使用“KB”、“MB”和“GB”之类的后缀乘法器)。将此值设置为0表示日志大小不受限制。

默认值:50MB。
必填:否。
介绍:3.0

4.4.1.3logfile_backups

活动日志文件轮换产生要保留的备份数。如果设置为0,将不保留任何备份。

默认值:10。
必填:否。
介绍:3.0

4.4.1.4loglevel

日志记录级别,指示要写入supervisord活动日志的内容。criticalerrorwarninfodebugtraceblather之一。注意,在日志级别debug中,supervisord日志文件将记录其子进程的stderr/stdout输出以及有关进程状态更改的扩展信息,这对于调试未正常启动的进程很有用。另请参阅:活动日志级别

默认值:info。
必填:否。
介绍:3.0

4.4.1.5pidfile

supervisord保留其pid文件的位置。此选项可以包含值%(here)s,该值将扩展到找到supervisord配置文件的目录。

默认值$CWD/supervisord.pid
必填:否。
介绍:3.0

4.4.1.6umask

supervisord进程的umask

默认值022
必填:否。
介绍:3.0

4.4.1.7nodaemon

如果为true,则supervisor将在前台启动而不是以守护进程。

默认值:false。
必填:否。
介绍:3.0

4.4.1.8silent

如果为true且未被守护,则日志将不会定向到stdout。

默认值:false。
必填:否。
介绍:4.2.0

4.4.1.9minfds

成功启动supervisord之前必须可用的文件描述符的最小数目。将调用setrlimit尝试提高supervisord进程的软限制和硬限制,以满足minfds。仅当supervisord以root身份运行时,才可以提高硬限制。supervisord不受限制地使用文件描述符,当无法从操作系统获得文件描述符时,它将进入故障模式,因此能够指定最小值以确保在执行期间不会耗尽它们是很有用的。这些限制将由托管子进程继承。此选项在Solaris上特别有用,因为Solaris默认情况下每个进程的fd限制较低。

默认值:1024。
必填:否。
介绍:3.0

4.4.1.10minprocs

成功启动supervisord之前必须可用的进程描述符的最小数目。将调用setrlimit尝试提高supervisord进程的软限制和硬限制,以满足minprocs。仅当supervisord以root身份运行时,才可以提高硬限制。当操作系统的进程描述符用完时,supervisord将进入故障模式,因此确保supervisord启动时有足够的进程描述符可用是很有用的。

默认值:200。
必填:否。
介绍:3.0

4.4.1.11nocleanup

防止supervisord在启动时清除任何现有的AUTO子日志文件。对于调试很有用。

默认值:false。
必填:否。
介绍:3.0

4.4.1.12childlogdir

用于AUTO子日志文件的目录。此选项可以包含值%(here)s,该值将扩展到找到supervisord配置文件的目录。

默认值:Python的tempfile.get_tempdir()的值。
必填:否。
介绍:3.0

4.4.1.13user

指示supervisord在执行任何有意义的处理之前将用户切换到该UNIX用户帐户。如果以root用户身份启动supervisord,才能切换用户。

默认值:不切换用户。
必填:否。
介绍:3.0

已更改:3.3.4。如果supervisord无法切换到指定的用户,它将向stderr写入一条错误消息,然后立即退出。在早期版本中,它将继续运行,但会在critical级别记录一条消息。

4.4.1.14directory

supervisord守护进程时,切换到该目录。此选项可以包含值%(here)s,该值将扩展到找到supervisord配置文件的目录。

默认值:不cd。
必填:否。
介绍:3.0

4.4.1.15strip_ansi

从子日志文件中删除所有ANSI转义序列。

默认值:false。
必填:否。
介绍:3.0

4.4.1.16environment

KEY="val",KEY2="val2"的形式的键/值对列表,这些键/值对将放置在supervisord进程的环境中(并因此放在其所有子进程的环境中)。此选项可以包含值%(here)s,该值将扩展到找到supervisord配置文件的目录。包含非字母数字字符的值应加引号(例如KEY="val:123",KEY2="val,456")。否则,引号值是可选的,但建议使用。要转义百分比字符,只需使用两个(例如URI="/first%%20name")。注意,子进程将继承用于启动supervisord的shell的环境变量,但此处和程序的environment选项中重写的变量除外。请参阅子进程环境

默认值:无值。
必填:否。
介绍:3.0

4.4.1.17identifier

RPC接口使用的此supervisor进程的标识符字符串。

默认值:supervisor。
必填:否。
介绍:3.0

4.4.2[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"

4.5[supervisorctl]设置

该配置文件可以包含supervisorctl交互式shell程序的设置。下面列出了这些选项。

4.5.1[supervisorctl]

4.5.1.1serverurl

用于访问supervisord服务的URL,例如http://localhost:9001。对于UNIX域套接字,使用unix:///absolute/path/to/file.sock

默认值http://localhost:9001
必填:否。
介绍:3.0

4.5.1.2username

传递给supervisord服务以进行身份验证的用户名。该名称应与你试图访问的端口或UNIX域套接字的supervisord服务配置中的username相同。

默认值:无用户名。
必填:否。
介绍:3.0

4.5.1.3password

传递给supervisord服务以进行身份验证的密码。这应该是你要访问的端口或UNIX域套接字的supervisord服务配置中password的明文版本。该值不能作为SHA哈希传递。与该文件中指定的其它密码不同,它必须以明文形式提供。

默认值:无密码。
必填:否。
介绍:3.0

4.5.1.4prompt

用作supervisorctl提示的字符串。

默认值supervisor
必填:否。
介绍:3.0

4.5.1.5history_file

用作readline永久历史记录文件的路径。如果通过选择路径启用此功能,则你的supervisorctl命令将保留在文件中,并且你可以使用readline(例如,向上箭头)来调用你在上一个supervisorctl会话中执行的命令。

默认值:无文件。
必填:否。
介绍:3.0a5

4.5.2[supervisorctl]示例

[supervisorctl]
serverurl = unix:///tmp/supervisor.sock
username = chris
password = 123
prompt = mysupervisor

4.6[program:x]设置

配置文件必须包含一个或多个program部分,以便supervisord知道应该启动和控制哪些程序。头值是复合值。它是“program”一词,紧接着是冒号,然后是程序名称。头值[program:foo]描述一个名称为“foo”的程序。该名称用于控制该配置所创建的进程的客户端应用程序。创建没有名称的program部分是错误的。名称中不得包含冒号或括号字符。名称的值用作%(program_name)s字符串表达式扩展在指定的其它值内的值。

注意:
[program:x]部分实际上代表supervisor的“同类进程组”(从3.0版开始)。该组的成员由配置中numprocsprocess_name参数的组合定义。默认情况下,如果numprocs和process_name保持默认值不变,则[program:x]表示的组将被命名为x,并且其中将包含名为x的单个进程。这提供了与较早的supervisor版本的向后兼容性,该版本不将程序部分视为同类的进程组定义。

但是,例如,如果你有一个[program:foo]部分,其numprocs为3,并且process_name表达式为%(program_name)s_%(process_num)02d,则“foo”组将包含三个进程,名为foo_00foo_01foo_02。这使得使用单个[program:x]部分启动许多非常相似的进程成为可能。所有日志文件名称、所有环境字符串以及程序命令也可以包含类似的Python字符串表达式,以便给每个进程传递略有不同的参数。

4.6.1[program:x]

4.6.1.1command

启动该程序时将运行的命令。该命令可以是绝对命令(例如/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_namehost_node_nameprogram_nameprocess_numnumprocshere(supervisord配置文件的目录),以及所有supervisord的环境变量以ENV_开头)的字典计算的。受控程序本身不应该是守护程序,因为supervisord假设它负责守护其子进程(请参阅子进程的Nondaemonization)。

注意:
如果该命令看起来像一个配置文件注释,则将被截断。例如,command=bash -c 'foo ; bar'将被截断为command=bash -c 'foo。引号不会阻止此行为,因为配置文件读取器不会像shell那样解析命令。

默认值:无默认。
必填:是。
介绍:3.0

已更改:4.2.0。添加了对numprocs扩展的支持。

4.6.1.2process_name

一个Python字符串表达式,用于组成该进程的supervisor进程名称。除非你更改numproc,否则通常无需担心设置此配置。将根据包含 group_namehost_node_nameprocess_numprogram_namehere(supervisord配置文件的目录)的字典对字符串表达式进行计算。

默认值%(program_name)s
必填:否。
介绍:3.0

4.6.1.3numprocs

Supervisor将启动与numprocs命名的程序一样多的实例。注意,如果numprocs > 1,则process_name表达式中必须包含%(process_num)s(或任何其它包含process_num的有效Python字符串表达式)。

默认值:1。
必填:否。
介绍:3.0

4.6.1.4numprocs_start

一个整数偏移量,用于计算numprocs的起始编号。

默认值:0。
必填:否。
介绍:3.0

4.6.1.5priority

程序在启动和关闭顺序中的相对优先级。较低的优先级表示程序在启动时以及在各种客户端中使用聚合命令时(例如“start all” /“stop all”)首先启动,最后关闭的程序。较高的优先级表示程序最后启动,然后首先关闭。

默认值:999。
必填:否。
介绍:3.0

4.6.1.6autostart

如果为true,则在启动supervisord时该程序将自动启动。

默认值:true。
必填:否。
介绍:3.0

4.6.1.7startsecs

在启动之后程序需要保持运行才能考虑启动成功的总秒数(将进程从STARTING状态移动到RUNNING状态)。设置为0表示该程序无需在任何特定时间内保持运行。

注意:
即使进程以“预期的”退出代码(请参见exitcodes)退出,但如果该进程退出的速度比startsecs快,则启动仍会被视为失败。

默认值:1。
必填:否。
介绍:3.0

4.6.1.8startretries

在放弃并使进程进入FATAL状态之前,尝试启动程序时,supervisord将允许的串行失败尝试次数。有关FATAL状态的说明,请参见进程状态

默认值:3。
必填:否。
介绍:3.0

4.6.1.9autorestart

指定当supervisord处于RUNNING状态时,如果退出是否应自动重启该进程。可能是falseunexpectedtrue的其中之一。如果为false,则该进程将不会自动重新启动。如果为unexpected,当程序退出时,退出代码不是与此进程的配置相关的退出代码之一(请参见exitcodes),则该进程将重新启动。如果为true,则退出时该进程将无条件重新启动,而不考虑其退出代码。

注意:
autorestart控制程序如果在成功启动后退出(进程处于RUNNING状态),supervisord是否会自动重启程序。

进程启动时(进程处于STARTING状态),supervisord具有不同的重启机制。进程启动期间的重试由startsecsstartretries控制。

默认值:unexpected。
必填:否。
介绍:3.0

4.6.1.10exitcodes

autorestart一起使用的该程序的“预期”退出代码列表。如果将autorestart参数设置为unexpected,并且该进程以除supervisor停止请求之外的任何其他方式退出,则如果该进程退出且退出代码未在此列表中定义,则supervisord将重新启动该进程。

默认值:0。
必填:否。
介绍:3.0

注意:
在4.0之前的Supervisor版本中,默认值为0,2。在Supervisor 4.0中,默认设置已更改为0。

4.6.1.11stopsignal

请求停止时用于终止程序的信号。可以是TERM、HUP、INT、QUIT、KILL、USR1或USR2中的任何一个。

默认值:TERM。
必填:否。
介绍:3.0

4.6.1.12stopwaitsecs

在向程序发送停止信号后,等待操作系统将SIGCHLD返回给supervisord的秒数。如果supervisord在从进程中接收到SIGCHLD之前经过了此秒数,supervisord将尝试使用最终SIGKILL杀死它。

默认值:10。
必填:否。
介绍:3.0

4.6.1.13stopasgroup

如果为true,则该标志使supervisor向整个进程组发送停止信号,并说明killasgroup为true。这对于程序(例如调试模式下的Flask)非常有用,这些程序不会将停止信号传播到其子级,而使它们成为孤立状态。

默认值:false。
必填:否。
介绍:3.0b1

4.6.1.14killasgroup

如果为true,则在向程序发送SIGKILL终止时,将其发送给整个进程组,同时还要照顾其子进程,这对于使用multiprocessing的Python程序很有用。

默认值:false。
必填:否。
介绍:3.0a11

4.6.1.15user

指示supervisord使用此UNIX用户帐户作为运行程序的帐户。仅当supervisord以root用户身份运行时才能切换用户。如果supervisord无法切换到指定用户,则该程序将不会启动。

注意:
仅将使用setuid更改用户。这不会启动登录Shell,也不会更改USERHOME之类的环境变量。有关详细信息,请参见子进程环境

默认值:不切换用户。
必填:否。
介绍:3.0

4.6.1.16redirect_stderr

如果为true,则将进程的stderr输出发送回其stdout文件描述符上的supervisord(以UNIX Shell术语来说,这等效于执行/the/program 2>&1)。

注意:

不要在[eventlistener:x]部分中设置redirect_stderr=true。事件监听器Eventlisteners使用stdoutstdinsupervisord进行通信。如果重定向stderr,则stderr的输出将干扰eventlistener协议。

默认值:false。
必填:否。
介绍:3.0,取代2.0的log_stdoutlog_stderr

4.6.1.17stdout_logfile

将进程stdout输出放入此文件中(如果redirect_stderr为true,也将stderr输出放入该文件中)。如果未设置stdout_logfile或将其设置为AUTO,则supervisor将自动选择文件位置。如果将其设置为NONE,则supervisord将不会创建任何日志文件。supervisord重启时,将删除AUTO日志文件及其备份。stdout_logfile值可以包含Python字符串表达式,该表达式将针对包含键group_namehost_node_nameprocess_numprogram_namehere(supervisord配置文件的目录)的字典进行计算。

注意:
启用轮换(stdout_logfile_maxbytes)时,两个进程不可能共享一个日志文件(stdout_logfile)。这将导致文件损坏。

注意:
如果将stdout_logfile设置为不可查看的特殊文件(例如/dev/stdout),则必须通过设置stdout_logfile_maxbytes = 0来禁用日志轮换。

默认值AUTO
必填:否。
介绍:3.0,取代2.0的logfile

4.6.1.18stdout_logfile_maxbytes

轮换stdout_logfile之前可能消耗的最大字节数(值中可以使用“KB”、“MB”和“GB”之类的后缀乘法器)。将此值设置为0表示日志大小不受限制。

默认值:50MB。
必填:否。
介绍:3.0,取代2.0的logfile_maxbytes

4.6.1.19stdout_logfile_backups

进程stdout日志文件轮换产生要保留的stdout_logfile备份数。如果设置为0,将不保留任何备份。

默认值:10。
必填:否。
介绍:3.0,取代2.0的logfile_backups

4.6.1.20stdout_capture_maxbytes

当进程处于“stdout捕获模式”时,写入捕获FIFO的最大字节数(请参阅捕获模式)。应为整数(值中可以使用后缀乘数,例如“KB”,“MB”和“GB”)。如果该值为0,则进程捕获模式将关闭。

默认值:0。
必填:否。
介绍:3.0

4.6.1.21stdout_events_enabled

如果为true,则在进程写入其stdout文件描述符时将发出PROCESS_LOG_STDOUT事件。仅当接收到数据时文件描述符未处于捕获模式时才会发出事件(请参阅捕获模式)。

默认值:0。
必填:否。
介绍:3.0a7

4.6.1.22stdout_syslog

如果为true,则将stdout连同进程名称一起定向到syslog。

默认值:False。
必填:否。
介绍:4.0.0

4.6.1.23stderr_logfile

除非redirect_stderr为true,否则将进程stderr输出放入此文件中。接受与stdout_logfile相同的值类型,并且可以包含相同的Python字符串表达式。

注意:
启用轮换(stderr_logfile_maxbytes)时,两个进程不可能共享一个日志文件(stderr_logfile)。这将导致文件损坏。

注意:
如果将stderr_logfile设置为不可查看的特殊文件(例如/dev/stderr),则必须通过设置stderr_logfile_maxbytes = 0来禁用日志轮换。

默认值AUTO
必填:否。
介绍:3.0

4.6.1.24stderr_logfile_maxbytes

轮换stderr_logfile的日志文件之前的最大字节数。接受与stdout_logfile_maxbytes相同的值类型。

默认值:50MB。
必填:否。
介绍:3.0

4.6.1.25stderr_logfile_backups

进程stderr日志文件轮换产生要保留的备份数。如果设置为0,将不保留任何备份。

默认值:10。
必填:否。
介绍:3.0

4.6.1.26stderr_capture_maxbytes

当进程处于“stderr捕获模式”时,写入捕获FIFO的最大字节数(请参阅捕获模式)。应为整数(值中可以使用后缀乘数,例如“KB”,“MB”和“GB”)。如果该值为0,则进程捕获模式将关闭。

默认值:0。
必填:否。
介绍:3.0

4.6.1.27stderr_events_enabled

如果为true,则在进程写入其stderr文件描述符时将发出PROCESS_LOG_STDERR事件。仅当接收到数据时文件描述符未处于捕获模式时才会发出事件(请参阅捕获模式)。

默认值:false。
必填:否。
介绍:3.0a7

4.6.1.28stderr_syslog

如果为true,stderr将与进程名称一起定向到syslog。

默认值:False。
必填:否。
介绍:4.0.0

4.6.1.29environment

格式为KEY="val",KEY2="val2"的键/值对的列表,该键/值对将放置在子进程的环境中。环境字符串可能包含Python字符串表达式,将根据包含group_namehost_node_nameprocess_numprogram_namehere(supervisord配置文件的目录)的字典对Python字符串表达式进行计算。包含非字母数字字符的值应加引号(例如KEY="val:123",KEY2="val,456")。否则,引号值是可选的,但建议使用。注意,子进程将继承用于启动“supervisord”的shell的环境变量,但此处重写的变量除外。请参阅子进程环境

默认值:无额外环境。
必填:否。
介绍:3.0

4.6.1.30directory

代表目录的文件路径,supervisord在执行子级之前应暂时将目录chdir。

默认值:不chdir(继承supervisor的)。
必填:否。
介绍:3.0

4.6.1.31umask

代表该进程的umask的八进制数字(例如002、022)。

默认值:无特殊umask(继承supervisor的)。
必填:否。
介绍:3.0

4.6.1.32serverurl

在环境中作为SUPERVISOR_SERVER_URL(请参见supervisor.childutils)传递给子进程的进程的URL,以使子进程可以轻松地与内部HTTP服务通信。如果提供的话,它应该与具有相同名称的[supervisorctl]部分选项具有相同的语法和结构。如果将其设置为AUTO或未设置,则supervisor将自动构造服务URL,优先选择在UNIX域套接字上监听的服务,而不是在Internet套接字上监听的服务。

默认值:AUTO。
必填:否。
介绍:3.0

4.6.2[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

4.7[include]设置

supervisord.conf文件可能包含名为[include]的部分。如果配置文件包含[include]部分,则它必须包含一个名为“files”的键。此项中的值指定要包含在配置中的其它配置文件。

注意:
[include]部分仅由supervisord处理。它被supervisorctl忽略。

4.7.1[include]

4.7.1.1files

以空格分隔的文件glob序列。每个文件glob可以是绝对的也可以是相对的。如果文件glob是相对的,则认为它是相对于包含它的配置文件的位置。“glob”是一种文件模式,它根据Unix shell使用的规则与指定的模式匹配。没有波浪符号~扩展,但是*?和用[]表示的字符范围将正确匹配。字符串表达式是根据包含host_node_name以及here(supervisord配置文件的目录)的字典计算的。不支持来自包含文件中的递归包含。

默认值:无默认值(必填)。
必填:是。
介绍:3.0

已更改:3.3.0。添加了对host_node_name扩展的支持。

4.7.2[include]示例

[include]
files = /an/absolute/filename.conf /an/absolute/*.conf foo.conf config??.conf

4.8[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启动时,barbaz同类组将不存在,并且原本属于它们的进程现在将移入foo组。

4.8.1[group:x]

4.8.1.1programs

程序名称的逗号分隔列表。列出的程序成为该组的成员。

默认值:无默认值(必填)。
必填:是。
介绍:3.0

4.8.1.2priority

类似于分配给该组的[program:x]优先级值的优先级数。

默认值:999。
必填:否。
介绍:3.0

4.8.2[group:x]示例

[group:foo]
programs=bar,baz
priority=999

4.9[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]部分的所有可用选项。

4.9.1[fcgi-program:x]

[fcgi-program:x]部分有一些[program:x]部分所没有的键。

4.9.1.1socket

此程序的FastCGI套接字、TCP或UNIX域套接字。对于TCP套接字,请使用以下格式:tcp://localhost:9002。对于UNIX域套接字,请使用unix:///absolute/path/to/file.sock。字符串表达式根据包含键“program_name”和“here”(supervisord配置文件的目录)的字典进行计算。

默认值:无默认值。
必填:是。
介绍:3.0

4.9.1.2socket_backlog

设置套接字监听(2)积压。

默认值:socket.SOMAXCONN。
必填:否。
介绍:3.4.0

4.9.1.3socket_owner

对于UNIX域套接字,此参数可用于指定FastCGI套接字的用户和组。可以是UNIX用户名(例如chrism)或以冒号分隔的UNIX用户名和组(例如chrism:wheel)。

默认值:使用为fcgi-program设置的用户和组。
必填:否。
介绍:3.0

4.9.1.4socket_mode

对于UNIX域套接字,此参数可用于指定权限模式。

默认值:0700。
必填:否。
介绍:3.0

有关其它允许的键,请参考4.6[program:x]设置,增量上述约束和补充。

4.9.2[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

4.10[eventlistener:x]设置

Supervisor允许在配置文件中定义专门的同类进程组(“事件侦听器池”)。这些池包含用于从supervisor的事件系统接收并响应事件通知的进程。有关事件如何工作以及如何实现可以声明为事件监听器的程序的说明,请参见事件

注意,eventlistener部分会遵守[program:x]部分的所有可用选项,但stdout_capture_maxbytes除外。事件侦听器不能在stdout上发出进程通信事件,但可以在stderr上发出(请参阅捕获模式)。

4.10.1[eventlistener:x]

[eventlistener:x]部分中有一些[program:x]部分所没有的键。

4.10.1.1buffer_size

事件监听器池的事件队列缓冲区大小。当监听器池的事件缓冲区溢出时(例如,事件监听器池无法跟上发送给它的所有事件的情况时,会发生这种情况),该缓冲区中最早的事件将被丢弃。

4.10.1.2events

以逗号分隔的事件类型名称列表,此监听器在接收通知时对此"感兴趣",(有效事件类型名称的列表,请参阅事件类型)。

4.10.1.3result_handler

一个pkg_resources入口点字符串,可解析为可调用的Python。缺省值是supervisor.dispatchers:default_handler。指定备用结果处理程序是一件非常不常见的事情,因此,如何创建一个结果处理程序没有文档记录。

有关其它允许的键,请参考4.6[program:x]设置,增量上述约束和补充。

4.10.2[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

4.11[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 AnotherRPCInterfacedef 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

4.11.1[rpcinterface:x]

4.11.1.1supervisor.rpcinterface_factory

pkg_resources将“entry point”点名命名为RPC接口的工厂函数。

默认值:N/A。
必填:否。
介绍:3.0

4.11.2[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官网

Linux安装supervisor:一个进程控制系统相关推荐

  1. linux查看进程grep工作组,Linux下查看一个进程打开了哪...-linux 如何找到进程的工作目录...-使用 grep 恢复误删的文本文件_169IT.COM...

    Linux下查看一个进程打开了哪些文件的命令示例,供大家学习参考. 查看进程14755(httpd)打开了哪些文件: 代码如下: localhost:~# lsof -p 14755 COMMAND ...

  2. linux启动一个进程吗,你知道,当你在 Linux 上启动一个进程时会发生什么嘛?

    原标题:你知道,当你在 Linux 上启动一个进程时会发生什么嘛? 本文是关于 fork 和 exec 是如何在 Unix 上工作的.你或许已经知道,也有人还不知道.几年前当我了解到这些时,我惊叹不已 ...

  3. linux如何启动一个进程而不阻塞,当你在 Linux 上启动一个进程时会发生什么? | Linux 中国...

    原标题:当你在 Linux 上启动一个进程时会发生什么? | Linux 中国 本文是关于 fork 和 exec 是如何在 Unix 上工作的.你或许已经知道,也有人还不知道.几年前当我了解到这些时 ...

  4. 如何在linux中关闭一个进程

    如何在linux中kill一个进程 刚开始学习Linux的时候,总是直接点击×来关闭程序.虽然知道这是关闭整个终端程序,但是奈何如此简单的事情对于新手来说都是很困难的.

  5. 线上redis一般安在linux_Redis企业级应用-Linux安装搭建一个完整的linxu线上服务(上)...

    我们在做项目的时候经常会遇到很多性能的问题,也成为整个系统优化最疼痛的问题,主要还是因为在用户量大的时候或者就是说高并发访问的时候,我们系统的数据库会有一个限制.当然也可以通过对数据库的优化对系统进行 ...

  6. 【服务器部署系列-003】Linux 部署supervisor守护进程

    目录 一.Centos安装Supervisor 二.基本命令与java服务配置实例 一.Centos安装Supervisor sudo yum install -y python-setuptools ...

  7. Linux 查看某一个进程占用内存情况

    Linux下查看某一个进程所占用的内存,首先可以通过ps命令找到进程id,比如 ps -ef | grep kafka 可以看到kafka这个程序的进程id 可以看到是2913,现在可以使用如下命令查 ...

  8. Linux 中统计一个进程的线程数

    如果你想看到 Linux 中每个进程的线程数,有以下几种方法可以做到这一点. 方法一: /proc proc 伪文件系统,它驻留在 /proc 目录,这是最简单的方法来查看任何活动进程的线程数. /p ...

  9. linux 如何查看一个进程空间所装载的共享库

    linux中每个进程空间都为共享库划分了专门区域,如下所图 查看一个进程所有已被映射的区域可以使用/proc/PID/maps看到 例如

最新文章

  1. 《深度学习,统计学习,数学基础》人工智能算法工程师手册:程序员写的AI书,50 章一网打尽...
  2. SAP WM 有无保存WM Level历史库存的Table?
  3. Node.js 博客实例(一)简单博客
  4. php where 不包含,php – 除非它们包含“where”或“like”子句,否则不允许删除
  5. 微信小程序——解决上传并部署云函数时报错ResourceNotFound.Function, 未找到函数版本,请创建后再试。 (7f2d9d2d-5eac-4575-9n57-acd66cfa587g
  6. 【博弈】取石子游戏(P2599)
  7. 立根融资租赁:内部系统平台上云
  8. java 超时异常_Java如何实现任务超时处理
  9. IDEA出现Module ** must not contain source root **. The root already belongs to module **这类错误的解决方法
  10. C#应用视频教程3.4 Halcon+C#测试
  11. vue 保留小数点厚一位_蓝盈莹真是一位有韵味的女人,羊羔绒还要拼上牛仔穿,真惹眼...
  12. 以前积攒的一个用Java程序生成验证码的代码
  13. 10投屏后没有声音_10年后,学区房有没有可能成为“负资产”?这位专家说了实话...
  14. linux设计引物探针,如何设计荧光定量PCR的引物及TaqMan探针
  15. 2018.9.13 贷款月供计算器
  16. 如何科学增长邮件订阅用户?
  17. 鸡兔同笼。已知鸡兔总头数为h,总脚数为f,求鸡兔各有多少只?
  18. 共识算法POW原理及实现
  19. java数独最快解_java快速解数独
  20. 火山视窗文件框基本操作介绍

热门文章

  1. 我的第一个音乐播放器
  2. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java社区养老服务平台9d127
  3. Wi-Fi 20mhz 和 40mhz 频段带宽的区别是什么? 图解
  4. WiFi 6/WiFi 6E 频段及BAND
  5. autodock tool文件_AutoDock PDBQT文件详解
  6. oracle 查叶子节点,oracle 层次查询判断叶子和根节点
  7. html内部阴影效果图,boxshadow内部阴影
  8. win7如何设置通电自动开机_windows7自动开机怎么设置?
  9. 第20以上的序数词怎么说
  10. 八个方面分析汉诺塔问题