一、介绍
supervisor 是用 Python 开发的一个 C/S 服务。是 Linux/Unix 系统下的进程管理工具。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制。
注意:只能用在Unix系统中,Windows用不了
二、安装
yum 方式
#更新yum源 wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo #yum安装 yum install supervisor -y
三、配置文件
cat /etc/supervisord.conf
[unix_http_server] file=/opt/supervisor.sock ; supervisorctl 使用的 socket 文件 chmod=0700 ; socket 文件权限 ;chown=nobody:nogroup ; socket file uid:gid owner ;username=user ; default is no username (open server) ;password=123 ; default is no password (open server) [inet_http_server] ; web 管理界面,即在页面做重启、停止等操作 port=*:9001 ; 监听端口 username=admin ; 用户 password=123 ; 密码 [supervisord] logfile=/var/log/supervisord.log ; supervisor日志文件 $CWD/supervisord.log logfile_maxbytes=50MB ; 日志文件大小,默认 50MB logfile_backups=1 ; 默认保留1个文件 loglevel=info ; 日志级别,默认info; 其他格式: debug,warn,trace pidfile=/var/run/supervisord.pid ; pid 文件 nodaemon=false ; 是否在前台运行,默认false,以 daemon模式运行 minfds=1024 ; 可以打开文件描述符的最小值 minprocs=200 ; 可以打开进程数最小值 ;umask=022 ; process file creation umask; default 022 ;user=chrism ; default is current user, required if root ;identifier=supervisor ; supervisord identifier, default is 'supervisor' ;directory=/opt ; default is not to cd during start ;nocleanup=true ; don't clean up tempfiles at start; default false ;childlogdir=/opt ; 'AUTO' child log dir, default $TEMP ;environment=KEY="value" ; key value pairs to add to environment ;strip_ansi=false ; strip ansi escape codes in logs; def. false [supervisorctl] serverurl=unix:///opt/supervisor.sock ; use a unix:// URL for a unix socket ;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket ;username=chris ; should be same as in [*_http_server] if set ;password=123 ; should be same as in [*_http_server] if set ;prompt=mysupervisor ; cmd line prompt (default "supervisor") ;history_file=~/.sc_history ; use readline history if available [include] files = /etc/supervisord.d/*.conf ;子文件
四、修改配合文件
vim /etc/supervisord.conf
[inet_http_server] ; inet (TCP) server disabled by default port=0.0.0.0:9001 ; ip_address:port specifier, *:port for all iface username=user ; default is no username (open server) password=123 ; default is no password (open server) [include] files = /etc/supervisord.d/*.conf 创建.conf目录 mkdir /etc/supervisord.d 创建nginx配置文件 vim nginx.conf [program:nginx] autorestart=True autostart=True redirect_stderr=True ;environment=PATH="" command=/usr/sbin/nginx -g 'daemon off;';
sbin/nginx这条命令默认是后台启动,但是supervisor不能监控后台程序,所以supervisor就一直执行这个命令,导致nginx一直在重启,加上-g 'daemon off;'这个参数可解决这问题,这个参数的意思是在前台运行 user=root ;process_name = %(program_name)s%(process_num)d ;numprocs=3 ;directory=/root/ stdout_logfile_maxbytes=20MB stdout_logfile_backups=20 ;stdout stdout_logfile=/var/log/supervisor/nginx.log stderr_logfile=/var/log/supervisor/nginx_error.log
五、supervisord配置块详解
- logfile:log文件路径 - logfile_maxbytes:log文件达到多少后自动进行轮转,单位是KB、MB、GB。如果设置为0则表示不限制日志文件大小 - logfile_backups:轮转日志备份的数量,默认是10,如果设置为0,则不备份 - loglevel:error、warn、info、debug、trace、blather、critical - pidfile:pid文件路径 - umask:umask值,默认022 - nodaemon:如果设置为true,则supervisord在前台启动,而不是以守护进程启动 - minfds:supervisord在成功启动前可用的最小文件描述符数量,默认1024 - minprocs:supervisord在成功启动前可用的最小进程描述符数量,默认200 - nocleanup:防止supervisord在启动的时候清除已经存在的子进程日志文件 - childlogdir:自动启动的子进程的日志目录 - user:supervisord的运行用户 - directory:supervisord以守护进程运行的时候切换到这个目录 - strip_ansi:消除子进程日志文件中的转义序列 - environment:一个k/v对的list列表
六、program配置详解
- command:启动程序使用的命令,可以是绝对路径或者相对路径 - process_name:一个python字符串表达式,用来表示supervisor进程启动的这个的名称,默认值是%(program_name)s - numprocs:Supervisor启动这个程序的多个实例,如果numprocs>1,则process_name的表达式必须包含%(process_num)s,默认是1 - numprocs_start:一个int偏移值,当启动实例的时候用来计算numprocs的值 - priority:权重,可以控制程序启动和关闭时的顺序,权重越低:越早启动,越晚关闭。默认值是999 - autostart:如果设置为true,当supervisord启动的时候,进程会自动重启。 - autorestart:值可以是false、true、unexpected。false:进程不会自动重启,unexpected:当程序退出时的退出码不是exitcodes中定义的时,进程会重启,true:进程会无条件重启当退出的时候。 - startsecs:程序启动后等待多长时间后才认为程序启动成功 - startretries:supervisord尝试启动一个程序时尝试的次数。默认是3 - exitcodes:一个预期的退出返回码,默认是0,2。 - stopsignal:当收到stop请求的时候,发送信号给程序,默认是TERM信号,也可以是 HUP, INT, QUIT, KILL, USR1, or USR2。 - stopwaitsecs:在操作系统给supervisord发送SIGCHILD信号时等待的时间 - stopasgroup:如果设置为true,则会使supervisor发送停止信号到整个进程组 - killasgroup:如果设置为true,则在给程序发送SIGKILL信号的时候,会发送到整个进程组,它的子进程也会受到影响。 - user:如果supervisord以root运行,则会使用这个设置用户启动子程序 - redirect_stderr:如果设置为true,进程则会把标准错误输出到supervisord后台的标准输出文件描述符。 - stdout_logfile:把进程的标准输出写入文件中,如果stdout_logfile没有设置或者设置为AUTO,则supervisor会自动选择一个文件位置。 - stdout_logfile_maxbytes:标准输出log文件达到多少后自动进行轮转,单位是KB、MB、GB。如果设置为0则表示不限制日志文件大小 - stdout_logfile_backups:标准输出日志轮转备份的数量,默认是10,如果设置为0,则不备份 - stdout_capture_maxbytes:当进程处于stderr capture mode模式的时候,写入FIFO队列的最大bytes值,单位可以是KB、MB、GB - stdout_events_enabled:如果设置为true,当进程在写它的stderr到文件描述符的时候,PROCESS_LOG_STDERR事件会被触发 - stderr_logfile:把进程的错误日志输出一个文件中,除非redirect_stderr参数被设置为true - stderr_logfile_maxbytes:错误log文件达到多少后自动进行轮转,单位是KB、MB、GB。如果设置为0则表示不限制日志文件大小 - stderr_logfile_backups:错误日志轮转备份的数量,默认是10,如果设置为0,则不备份 - stderr_capture_maxbytes:当进程处于stderr capture mode模式的时候,写入FIFO队列的最大bytes值,单位可以是KB、MB、GB - stderr_events_enabled:如果设置为true,当进程在写它的stderr到文件描述符的时候,PROCESS_LOG_STDERR事件会被触发 - environment:一个k/v对的list列表 - directory:supervisord在生成子进程的时候会切换到该目录 - umask:设置进程的umask - serverurl:是否允许子进程和内部的HTTP服务通讯,如果设置为AUTO,supervisor会自动的构造一个url
七、执行
# supervisord -c /etc/supervisord.conf # supervisorctl
# 重启supervisor
# supervisorctl reload