官网参考
简介
- Supervisor运行在类unix操作系统,不支持windows;
- 客户端 / 服务端 软件架构模式;
- 帮助用户监控、管理一系列的进程的软件系统;
- 将开启的进程作为自己的子进程,可以准确地地获取子进程的运行状态,且子进程异常退出后,也可以重启它们;
- 可以代理普通用户去管理需要更高权限或者root权限的进程,只需使用root账户启动Supervisord即可;
- 可以将进程进行分组,作为一个整体来启动、停止;当子进程退出时,操作系统立即通过信号通知Supervisor,非常高效;
- 纯python实现,安装比较简单,支持python2.7、python3.4+;
- 组件
-
supervisord
,服务进程;- 负责启动子进程、响应客户端指令、重启退出的子进程、为子进程记录日志等;
- 配置文件 /etc/supervisord.conf ,可能包含密码等敏感信息,严格控制访问权限;
-
supervisorctl
,命令行客户端;- 连接supervisord服务进程,管理其子进程;
-
Web Server,web接口
- inet_http_server 配置项激活
- 访问http://localhost:9001/
-
XML-RPC Interface 文档
-
安装
- 需网络连接
- pip install supervisor
- 或者下载源码,然后python setup.py install
- 自行编写配置文件;
- 无网络时,需提前下载相关的依赖包,安装依赖,然后安装supervisor;
- 操作系统的包管理器安装
- Ubuntu
- 查看是否可以安装,apt-cache show supervisor;
- 安装,sudo apt-get install supervisor; 安装后自动加入系统服务管理,开机自启动
- 在/etc/supervisor/supervisord.conf 有配置文件;
- CentOS
- 查看是否可以安装, yum info supervisor;
- 安装,yum install -y supervisor;
- Ubuntu
创建配置文件
安装supervisor之后,打印配置文件:
# 输出配置文件
$ echo_supervisord_conf > /etc/supervisord.conf # 需要root权限,若没有权限,则放在当前目录下
# 运行supervisord 服务
$ supervisord -c /etc/supervisord.conf # -c 指定配置文件
supervisord 的参数
命令行选项:
-c FILE, --configuration=FILE ,指定配置文件(后台启动);
-n, --nodaemon,前台启动supervisord服务;
-s, --silent,不输出内容;
-h, --help 帮助信息
-u USER, --user=USER,用户名或者id
-m OCTAL, --umask=OCTAL ,supervisord启动后应该使用的umask;
-d PATH, --directory=PATH,supervisord进程进入后台前,切到该目录;
-l FILE, --logfile=FILE,日志文件
-y BYTES, --logfile_maxbytes=BYTES,supervisord活动日志最大大小,如1MB
-z NUM, --logfile_backups=NUM,备份副本数(每个副本都是logfile_maxbytes大小)
-e LEVEL, --loglevel=LEVEL,日志级别 trace, debug, info, warn, error, critical.
-j FILE, --pidfile=FILE,pid文件
-i STRING, --identifier=STRING,supervisord的字符串标识符;
-q PATH, --childlogdir=PATH,必须存在的目录,来存储子进程的日志;
-k, --nocleanup,防止supervisord在启动时清空子进程之前的日志;
-a NUM, --minfds=NUM,supervisord可以使用的最少的文件描述符数量;
-t, --strip_ansi,从所有的子进程日志中删除 ansi 转义序列;
-v, --version,查看版本;
–profile_options=LIST 逗号分割的列表选项;
–minprocs=NUM,supervisord可以使用的最少进程槽;
supervisorctl 使用
-
supervisorctl 进入交互模式,并查看所有指令;
-
supervisorctl + 参数 不进入交互模式,直接执行指令;
-
命令行选项
-c, 配置文件 (未指定时,先搜索当前目录,再搜索 /etc/supervisord.conf)
-h, --help 帮助
-i, --interactive,直行命令后开启交互模式;
-s, --serverurl URL, supervisord服务进程监听的地址(default “http://localhost:9001”).
-u, --username,认证的用户名
-p, --password,认证的密码
-r, --history-file, 保留readline的历史记录; -
命令action
-
help xxx,查看帮助信息;
-
add <name> […] ,激活进程、进程组的任何更新;
-
remove <name> […] ,删除进程或者进程组
-
update,根据需要更新配置,并重启受影响的程序;
-
update all,同update;
-
update <gname> […] 更新指定的组,并重启受影响的程序;
-
clear <name> ,清空一个进程的日志文件;
-
clear <name> <name> ,清空多个进程的日志文件;
-
clear all ,清空所有进程的日志文件;
-
fg <process> ,前台模式连接一个进程,Ctrl+C 退出;
-
pid,Get the PID of supervisord.
-
pid <name>,根据名字获取一个子进程的pid;
-
pid all ,获取每个子进程的pid;
-
reload,重启supervisord服务;
-
reread,重新加载守护程序的配置文件;
-
restart <name>,重启一个子进程,不会重新加载配置;
-
restart <gname>,重启一个子进程组,不会重新加载配置;
-
restart <name> <name> 重启多个子进程或者组;
-
restart all,重启所有的子进程;
-
signal,信号
-
start <name>,开启一个子进程或者组;
-
start <name> <name> 开启多个子进程或者组;
-
start all,开启所有的子进程;
-
status,查看所有子进程的状态信息;
-
status <name>,查看一个子进程或者组的状态;
-
status <name> <name>,查看多个子进程状态信息;
-
stop <name> 停止一个子进程或者组;
-
stop <name> <name> 停止多个子进程或者组;
-
stop all,停止所有的子进程;
-
tail [-f] <name> [stdout|stderr] ,输出子进程日志的结尾的部分; Ctrl-C 退出;
tail -100 <name>
,last 100 bytes of process stdout
tail <name> stderr
, last 1600 bytes of process stderr
-
信号
由操作系统发给Supervisord服务进程的信号,包含如下:
-
SIGTERM,关闭supervisord及其所有子进程;
-
SIGINT,类似SIGTERM、SIGQUIT;
-
SIGHUP,关闭所有进程,重新加载找到的第一个配置文件,并启动所有进程;
-
SIGUSR2,supervisord将关闭并重新打开主活动日志和所有子日志文件;
为了安全起见,supervisor的所有配置文件、依赖文件等
都不能被无权限的用户读写;PYTHONPATH也需要有健全的文件权限保护;
配置文件选项
-
配置文件命名为
supervisord.conf
,被supervisord和supervisorctl 两个组件同时使用; -
若两个组件运行时,未通过-c指定配置文件,则搜索路径为:
$CWD 表示当前目录 -
格式:配置文件是一个windows-ini 类型的文件,由数个部分组成,每个部分都是用[xxx]标识,内部使用key-value键值对;
-
[unix_http_server] 标识部分,配置监听unix域套接字的http server;
- file = unix域套接字的路径,用来监听http请求或者XML rpc请求;supervisorctl就是通过XML rpc请求走该套接字,与supervisord进程通信;
- chmod 修改unix域套接字的权限模式为当前值;
- chown 修改unix域套接字用户、用户组为当前值;
- username 需要认证的用户;
- password 用户的密码;
[unix_http_server]
file = /var/run/supervisor.sock
chmod = 0777
chown= nobody:nogroup
username = user
password = 123
- [inet_http_server]标识部分,监听tcp套接字的http server;
- 配置文件中默认没有该配置部分,即默认不开启;
- 若要开启,需注意安全性,一般绑定localhost 或者在一个安全隔离的网络环境;
禁止暴露在公网中!
- port = localhost:9001 ,supervisord监听http请求或者XML rpc 请求;必须参数;
- username 需要认证的用户
- password 用户的密码
[inet_http_server]
port = 127.0.0.1:9001
username = user
password = 123
- [supervisord] 标识部分,服务进程的配置
- logfile,活动日志文件,设置为/dev/stdout时,logfile_maxbytes必须为0;
- loglevel, 日志级别,critical, error, warn, info, debug, trace;
- logfile_maxbytes ,最大日志文件bytes大小,设置为0不限制,默认50MB;
- logfile_backups,最大备份数;默认10
- pidfile,进程id文件;
- nodaemon,前台启动方式
- silent, 前台启动时,不输出日子
- minfds,可用的最少文件描述符;
- minprocs,可用的最少进程描述符;
- nocleanup,防止supervisord启动时清空子进程的日志文件;
- childlogdir,子进程日志存储目录;
- user,在任何处理前,切换到该用户;
- directory,后台启动时进入该目录;
- strip_ansi,从子进程日志文件中清除ansi转义序列;
- environment,所有子进程的环境变量,key-val形式的键值对,如KEY=“val”,KEY2=“val2” 表示环境变量,放入所有子进程,但不影响supervisord进程;当val包含非字母、非数字时,必须引号;子进程也会继承开启supervisord的shell进程的环境变量;val中使用%%表示一个%;
- identifier,supervisord进程的标识符,用于rpc通信;
[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],客户端的配置;
- serverurl,访问服务进程的url地址;
- username,认证的用户
- password,认证的密码;
- prompt,命令提示符;
- history_file,记录历史命令的文件;
[supervisorctl]
serverurl = unix:///tmp/supervisor.sock
username = chris
password = 123
prompt = mysupervisor
- [program:xxx],管理的应用程序(进程);
- xxx表示进程的名称
command
,启动该进程运行的命令;绝对路径或者相对路径(搜索supervisord进程的$PATH环境变量,找到可执行文件)- 如/bin/xxx arg1 arg2 接收命令行参数;
- /path/to/program -p “foo bar”;双引对参数分组;
- 可以包含表达式,如/path/to/program --port=80%(process_num)02d 可以扩展为 /path/to/program --port=8000
- 该应用程序进程应为前台启动,然后supervisord将他们改为后台方式;
- 若 command=bash -c ‘foo ; bar’ ,这种类似配置文件的方式会被截断,得到command=bash -c 'foo
- process_name,当前进程名称,默认为%(program_name)s,numprocs=1时,不用管;
- numprocs,当前应用的进程数(默认1),numprocs > 1时,process_name必须包含%(process_num)s
- numprocs_start ,多个进程时的起始索引值,默认0;
- priority,应用程序的优先级,默认999;
- 低优先级先启动、最后关闭;
- 高优先级最后启动、先关闭;
- autostart,默认true,supervisord启动时,自动启动该应用程序;
- startsecs,应用程序从启动(starting)到==稳定运行(stay running)==所需时间,默认1;
- startretries,重启次数,默认3
- autorestart,应用程序从运行态退出后,是否应该重启;
- false,不重启;
- unexpected,非预期退出(退出的状态码不在exitcodes中)时,自动重启;默认
- true, 一旦退出,就自动重启;
- exitcodes 退出的状态码列表,默认0;
- stopsignal ,停止信号,当用户通过supervisorctl 发送stop指令时,stopsignal被用来杀掉对应的进程;可以为TERM, HUP, INT, QUIT, KILL, USR1, or USR2,默认为TERM;
- stopwaitsecs,停止一个应用程序等待的时间,若超过该时间,则supervisord会发送SIGKILL强制杀掉该进程;默认为10
- stopasgroup,默认false,若为true,则将该应用进程及其子进程作为一个整体来停止,同时将killasgroup认为true;防止仅关闭应用的父进程,导致子进程成为孤儿进程;
- killasgroup,默认false,若为true, 则关闭父进程及其子进程;
- user,使用当前用户作为运行应用程序的账户;只有supervisord以root权限运行时,才可以切换;
- redirect_stderr,重定向标准错误到标准输出,默认false,相等于/the/program 2>&1
- stdout_logfile,标准输出的日志文件;
- stdout_logfile_maxbytes, 默认50MB
- stdout_logfile_backups,默认10
- stdout_capture_maxbytes,在capture模式下,可以写入的捕获FIFO的最大日志,默认0;
- stdout_events_enabled,若为true,则(非捕获模式下)写入到标准输出时,触发 PROCESS_LOG_STDOUT事件;
- stdout_syslog,标准输出定向到syslog,默认false;
- stderr_logfile,标准错误的日志文件,若redirect_stderr为true,则该选项可不指定;若指定的标准错误日志文件找不到(not seekable like /dev/stderr),则stderr_logfile_maxbytes = 0,即log rotation必须禁用;
- stderr_events_enabled,默认false
- stderr_syslog, 定向到syslog;
- environment,应用程序进程的环境变量,如KEY=“xxx”,KEY2=‘xxx’;
- directory,在启动应用程序进程前,supervisord临时进入该目录;
- umask,一个八进制数,表示进程的umask码;默认不指定,继承supervisor的
- serverurl,supervisord服务的地址,unix域的socket 或者tcp socket; 默认AUTO
[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
- [group:xxx], 进程组
- programs表示配置的应用程序
- priority,组的优先级
[group:foo]
programs=bar,baz
priority=999
- [include] 包含其他配置文件
- files=/xxx/path/xx.conf ,文件名可以使用通配符表示;
[include]
files = /an/absolute/f1.conf /an/absolute/*.conf foo.conf config??.conf
- [fcgi-program:x] 快速公共网关接口,应用程序,在supervisor3.4版本前,该应用不能被[group:xx] 块引用;
- socket, fast-cgi socket连接;如TCP连接:tcp://localhost:9002.;UNIX domain sockets,unix:///absolute/path/to/file.sock
- socket_backlog,最大监听数,如listen(100);
- socket_owner,对于UNIX domain sockets设置用户、组, 如user:group
- socket_mode,对于UNIX domain sockets ,设置权限,默认0700;
- 其他选项同program部分
[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=true
killasgroup=true
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] 事件监听池
- buffer_size,监听池事件队列的大小;满时删除最早的时间;
- events,逗号分割的事件列表;事件类型
- result_handler,事件处理器
- 其他选项同==[program:xxx]==
[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:supervisor]块;
- 自定义another接口,函数需接收一个supervisord位置参数,收集关键字参数(配置项以关键字参数传入),内部返回AnotherRPCInterface实例;
[rpcinterface:another]
supervisor.rpcinterface_factory = my_package:another_rpc_interface
retries = 1
下一篇: supervisor 的子进程