目标环境为 :centos7
1. 安装
pip install supervisor
ln -sv /usr/local/python3.7/bin/supervisorctl /usr/bin/supervisorctl
ln -sv /usr/local/python3.7/bin/supervisord /usr/bin/supervisord
2. 使用
配置文件
supervisord.conf
; Sample supervisor config file.
;
; For more information on the config file, please see:
; http://supervisord.org/configuration.html
;
; Notes:
; - Shell expansion ("~" or "$HOME") is not supported. Environment
; variables can be expanded using this syntax: "%(ENV_HOME)s".
; - Comments must have a leading space: "a=b ;comment" not "a=b;comment".
[unix_http_server]
file=/var/run/supervisor.sock ; (the path to the socket file)
[inet_http_server]
port = 127.0.0.1:9001
;username = user
;password = 123
[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile_maxbytes=5MB ; (max main logfile bytes b4 rotation;default 50MB)
logfile_backups=2 ; (num of main logfile rotation backups;default 10)
loglevel=info ; (log level;default info; others: debug,warn,trace)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
nodaemon=true ; (start in foreground if true;default false)
minfds=1024 ; (min. avail startup file descriptors;default 1024)
minprocs=200 ; (min. avail process descriptors;default 200)
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket
[include]
files = httpd.conf
httpd.conf
[program:httpd]
command=nginx -g "daemon off;" ; the program (relative uses PATH, can take args)
numprocs=1 ; number of processes copies to start (def 1)
autostart=true ; start at supervisord start (default: true)
startsecs=1 ; # of secs prog must stay up to be running (def. 1)
autorestart=true ; when to restart if exited after running (def: unexpected)
stdout_logfile=/var/log/supervisor/httpd.log ; stdout log path, NONE for none; default AUTO
stdout_logfile_maxbytes=5MB ; max # logfile bytes b4 rotation (default 50MB)
stdout_logfile_backups=2 ; # of stdout logfile backups (default 10)
stderr_logfile=/var/log/supervisor/httpd_err.log ; stderr log path, NONE for none; default AUTO
stderr_logfile_maxbytes=5MB ; max # logfile bytes b4 rotation (default 50MB)
stderr_logfile_backups=2 ; # of stderr logfile backups (default 10)
将上面两个脚本放到同一个目录,然后执行下面的命令
mkdir /var/log/supervisor
supervisord -c supervisord.conf
结果如下 :
通过supervisorctl status能看到httpd进程已经被supervisor接管并正常启动了。
3. 配置解释
Supervisor的使用主要在于配置
http://supervisord.org/configuration.html 这是官网多配置的解释了示例。
3.1 unix_http_server
侦听HTTP / XML-RPC请求的UNIX域套接字的路径。Supervisorctl使用XML-RPC通过该端口与Supervisor通信。此选项可以包含值%(here)s,该值将扩展到找到监管配置文件的目录。
[unix_http_server]
file = /tmp/supervisor.sock ;UNIX域套接字的路径,一般要改下路径
chmod = 0777 ;UNIX权限模式, 可注释
chown= nobody:nogroup ;将套接字文件的用户和组更改为此值, 可注释
username = user ;对此HTTP服务器进行认证的用户名, 可注释
password = 123 ;对此HTTP服务器进行认证的密码, 可注释
3.2 inet_http_server
侦听HTTP / XML-RPC请求的TCP host:port值或(例如127.0.0.1:9001)。 supervisorctl将使用XML-RPC通过此端口与supervisor通信。
[inet_http_server]
port = 127.0.0.1:9001 ;监听端口
username = user ;认证用户名 可注释
password = 123 ;认证密码 可注释
3.3 supervisorctl
该配置文件可能包含 supervisorctl交互式shell程序的设置。
[supervisorctl]
serverurl = unix:///tmp/supervisor.sock ;于访问受管服务器的UR
username = chris ;认证用户名 可注释
password = 123 ;认证密码 可注释
prompt = mysupervisor ;用户提示的字符串 可注释
3.4 supervisord
supervisord全局设置。
[supervisord]
logfile = /tmp/supervisord.log ;日志文件保存路径
logfile_maxbytes = 50MB ;日志文件的最大大小
logfile_backups=10 ;最多多少个日志文件supervisord.log1 2 3 ...
loglevel = info ;日志级别critical/error/warn/info/debug/trace/blather
pidfile = /tmp/supervisord.pid ;进程pid文件
nodaemon = false ;false为后台运行
minfds = 1024 ;可用的最小文件描述符数目
minprocs = 200 ;可用的最小数量的过程描述符
umask = 022 ;supervisord进程的umask
user = chrism ;在执行任何有意义的处理之前,将用户切换到这个UNIX用户帐户
identifier = supervisor ;此管理程序进程的标识符字符串,由RPC接口使用。
directory = /tmp ;当supervisord守护进程时,切换到该目录
nocleanup = true ;防止 在启动时清除任何现有的AUTO子日志文
childlogdir = /tmp ;用于AUTO子日志文件的目录
strip_ansi = false ;从子日志文件中删除所有ANSI转义序列
environment = KEY1="value1",KEY2="value2" ;键/值对的列表环境变量,子进程全部继承。
3.5 program:x
Supervisor监控的子进程
[program:httpd] ;httpd为supervisor显示进程名名字
command=nginx -g "daemon off;" ;进程运行命令,只能前台运行的
process_name=%(program_name) ;一个Python字符串表达式,默认注释
numprocs=1 ;启动的进程数
directory=/tmp ;进程运行后切换的目录
umask=022 ;进程的umask
priority=999 ;优先级
autostart=true ;在supervisor启动时候自动启动
autorestart=unexpected ;如果异常退出,则重启
startsecs=10 ;进程必须running 10秒才算成功
startretries=3 ;进程启动失败的重试次数
exitcodes=0 ;进程退出时候的预期code码
stopsignal=TERM ;终止信号
stopwaitsecs=10 ;向程序发送停止信号后,等待操作系统返回SIGCHLD给主进程的秒
stopasgroup=false ;如果为true,将导致管理器向整个进程组发送停止信号
killasgroup=false ;如果为true,把它发送给它的整个进程组
user=chrism ;用该用户帐户作为运行程序的帐户
redirect_stderr=false
stdout_logfile=/a/path ;日志文件
stdout_logfile_maxbytes=1MB ;日志文件的大小
stdout_logfile_backups=10 ;最多10个日志文件滚动
stdout_capture_maxbytes=1MB
stdout_events_enabled=false
stderr_logfile=/a/path ;错误日志文件
stderr_logfile_maxbytes=1MB ;日志文件的大小
stderr_logfile_backups=10;最多10个日志文件滚动
stderr_capture_maxbytes=1MB
stderr_events_enabled=false
environment=A="1",B="2" ;进程的环境变量
serverurl=AUTO
3.6 nclude
用于包含其他的conf文件,一般一个进程对应一个conf文件,然后用include来包含
[include]
files = /an/absolute/filename.conf /an/absolute/*.conf foo.conf config??.conf
3.7 rpcinterface:x
[rpcinterface:supervisor]部分必须保留在配置中,以便标准设置的supervisor能够正常工作。如果你不想让主管做任何它没有开箱即用的事情。
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
3.8 ventlistener: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 ;运行超过1秒才算成功
startretries=3 ;启动失败重试次数
exitcodes=0 ;正常退出的code码
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
3.9 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
3.10 group:x
将多个子进程归并到同一个组,从而可以进行统一控制。
[group:foo]
programs=bar,baz
priority=999
4. 避坑
- Supervisor 不能接管后台运行的进程,只能接管前台运行的进程
例如
nginx -g "daemon off;" 是一条前台运行的命令,能够正常接管
如果command=nginx, 实际上nginx已经运行了,但是会supervisor会提示报错,一直再重启。