简介
用python开发的c/s服务,是类unix系统下的一个进程管理工具,用于在类unix系统管理多个子进程;与系统的级别的runit程序有同样的功能。
1、原理:
supervisor管理的进程,使管理的进程作为子进程来运行,supervisor是父进程,supervisor来监控子进程的启动、关闭、异常退出、自动重启等操作。
2、使用条件:
要求管理的程序是非daemon程序,将管理的程序转换为daemon程序
3、特点:
- 简单方便:直接将需要管理的程序,配置到supervisor.conf文件中就可以对程序进行管理
- 进程分组:支持分组([group:foo])管理进程的启动和停止,也支持优先级(priority)配置
- 可扩展性:supervisor有一个简单的事件(event)通知协议,还有一个用于控制的XML-RPC接口,可以用Python开发人员来扩展构建。
- 权限:可以设置一个非root用户(user=chrism)对supervisor.conf配置的进程进行管理
- 兼容性、稳定性:supervisor由Python编写,在除Windows操作系统以外基本都支持,如linux,Mac OS x,solaris,FreeBSD系统
4、组成部分
supervisord : supervisor的服务端程序;主要启动supervisor程序本身,启动管理的子进程,响应客户端的命令,记录子进程的响应的日志,解析配置文件supervisord.conf等功能
supervisorctl:客户端命令行,提供用户查看子进程列表、获取子进程状态、管理子进程;supervisortcl不仅可以连接本机的
supervisord,还可以连接远程的supervisord,在本机通过unix socket连接,远程通过TCP连接;与supervisord通信是通过xml_rpc,对应的配置在[supervisorctl]模块下
Web Server:提供与supervisorctl功能相当的Web操作页面
XML-RPC Interface:XML-RPC接口,提供远程调用的协议
问题
管理的进程如何重启? 通过传递信号
安装
1、centos类系统安装
通过yum安装 1、yum install -y supervisor
通过easy_install安装 1、安装python包管理工具(esay_install) yum install python-setuptools
2、安装supervisor easy_install supervisor
2、ubuntu类系统安装
apt-get install supervisor
3、启动
[root@supervisor]$supervisord -c /data/www/supervisord.conf
[root@supervisor]$which supervisord
/usr/bin/supervisord
[root@supervisor]$which supervisorctl
/usr/bin/supervisorctl
[root@supervisor]$ps aux | grep supervisord
root 12877 0.0 0.8 220288 15436 ? Ss 2019 110:10 /usr/bin/python2 /usr/bin/supervisord -c /data/supervisor/supervisord.conf
配置文件supervisor.conf
重新加载配置文件
supervisorctl reload
配置组成
1、supervidord
主要是定义supervisord进程相关的设置,必须设置
[supervisord]
logfile=/data/supervisor/supervisor_oyjblog.log ;记录supervisord主进程的日志路径,默认$CMD/supervisord.log,$CMD是当前目录,非必须设置
logfile_maxbytes=50MB ;上面日志文件的最大大小,当超过50M的时候,会生成一个新的日志文件;设置为0时,表示不限制大小,默认值50M,非必须设置
logfile_backups=10 ;日志文件保持数量,上面的日志文件大于50M时,就会生成一个新文件,文件熟练大于10时,最初的老文件被新文件覆盖,文件数量将保持10;当设置为0时,表示不展示文件数量,默认值为10,非必须设置
loglevle=info ;日志级别,有critical,error、warn、info、debug、trace、blather等;默认为info,非必须设置
pidfile=/data/supervisor/supervisor_oyjblog.pid ;pid文件路径,默认为$CMD/supervisord.pid;非必须设置
nodaemon=false ;如果是true,supervisord进程将在前台运行,如果false,则已守护进程运行;默认为false,非必须设置
minfds=1024 ;最少系统空闲的文件描述符,低于这个值supervisor将不会启动;系统的文件描述符设置位置:/proc/sys/fs/file-max;默认1024,非必须设置
minprocs=200 ;//最小可用进程描述符,低于这个值supervisor将不会正常启动;ulimit -u 可以查看linux下面用户的最大进程数;默认200,非必须设置
;umask=022 ;创建文件的掩码,默认022,非 必须设置
;user=chrism ;这个参数可以设置一个非root用户,当我们以root用户启动supervisord之后,设置的用户也可以对supervisord进行管理;默认情况是不设置,非必须设置项
;identifier=supervisor ;supervisrod的标识符,提供给XML_RPC使用;默认supervisord,非必须设置项
;directory=/tmp ;当supervisord作为守护进程运行的时候,设置这个参数的话,启动supervisord进程之前,会先切换到这个目录;默认不设置,非必须设置
;nocleanup=true ;false:会在supervisord进程启动的时候,把以前子进程产生的日志清除掉;默认为false,非必须设置
;childlogdir=/tmp ;当子进程日志路径为AUTO的时候,子进程日志文件存放路径;非必须设置
;environment=KEY="value" ;设置环境变量
;strip_ansi=false ;true:会清除子进程日志中所有ANSI序列;非必须设置
2、rpcinterface:supervisor
此模块是给XML_RPC用的,当然你如果想使用supervisord或者web server这个选项是必须要开启的
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
3、supervisorctl
此模块主要是针对supervisorctl的一些设置
[supervisorctl]
serverurl=unix:///data/supervisor/oyjblog.sock ;本地unix socket路径,与[unix_http_server]配置的socket相呼应;非必须设置
;serverurl=http://127.0.0.1:9001 ;supervisorctl远程连接supervisord的时候,用到的TCP socket路径,与[inet_http_server]对应;非必须设置
;username=chris ;用户名 默认空 非必须设置
;password=000000 ;密码 默认空 非必须设置
;prompt=mysupervisor ; 输入用户名免时候的提示符,默认supervisor 非必须设置
;histtory_filr=~/.sc_history ;这个参数和shell中的history类似,可以用上下键来查找签名执行过的命令;默认是no file,非必须设置
4、unix_http_server
本地socket连接
[unix_http_server]
file=/data/supervisor/oyjblog.sock ;socket文件路径,supervisorctl用XML_RPC和supervisord本地通信就是通过它;如果不设置supervisorctl就不能使用了,不设置默认为none
;chmod=0700 ;socket文件权限,不设置默认为0700,非必须设置
;chown=web:web ;socket文件所属用户及用户组,不设置的话默认为启动supervisord进程的用户及用户组,非必须设置
;username=oyj ;使用supervisorctl连接的时候,认证的用户名,默认没有用户名
;password=000000 ;使用supervisorctl连接的时候,认证的用户名,默认没有密码
5、inet_http_server
监听tcp上的socket,WebServer和远程supervisorctl使用的配置,不设置默认不开启,非必须设置
[inet_http_server]
port=47.98.161.80:8080 ;监听的IP和端口,上面开启此处必须设置
;username=oyj ;使用supervisorctl连接的时候,认证的用户名,默认没有用户名
;passowrd=000000 ;使用supervisorctl连接的时候,认证的用户名,默认没有密码
6、program
监控的程序(子进程)模块相关设置
[program:blog]
command=/data/www/oyjblog ;程序的路径
process_name=blog ;程序名称
autostart=true ;true:子进程将在supervisord启动后被自动启动,默认就是true,非必须设置
autorestart=true ;这个是设置子进程挂掉后自动重启的情况,有三个选项false,unexpected,true;如果为false,无论什么情况都不会重新启动;如果为unexpected,只有当进程退出码不在下面的exitcodes里面定义的退出码的时候,才会被自动重启;当为true的时候,只要子进程挂掉,将会被无条件重启
numprocs=1 ;进程数量,当不为1时,就是进程池的概念,要与process_name相呼应,默认为1,非必须设置
directory=/data/www/ ;进程运行前,会切换到这个目录,默认不设置,非必须设置
stdout_logfile=/data/logs/blog_out.log ;子进程的stdout的日志路径,可以指定路径,AUTO,none等三个选项;设置为none的话,将没有日志产生;设置为AUTO的话,将随机找一个地方生成日志文件,而且当supervisord重新启动的时候,以前的日志文件会被清空;当redirect_stderr=true的时候,sterr也会写进这个日志文件
;stdout_logfile_maxbytes=1MB ; 日志文件最大大小,和[supervisord]中定义的一样。默认为50MB
;stdout_logfile_backups=10 ; 和[supervisord]定义的一样。默认10MB
;stdout_capture_maxbytes=1MB ; 设定capture管道的大小,当值不为0的时候,子进程可以从stdout发送信息,而supervisor可以根据信息,发送相应的event;默认为0,为0的时候表达关闭管道;非必须项
;stdout_events_enabled=false ; 当设置为ture的时候,当子进程由stdout向文件描述符中写日志的时候,将触发supervisord发送PROCESS_LOG_STDOUT类型的event默认为false;非必须设置
stderr_logfile=/data/logs/blog_error.log ;设置stderr写的日志路径,当redirect_stderr=true就不用设置了,设置了也不起作用。因为它会被写入stdout_logfile的同一个文件中默认为AUTO,也就是随便找个地存,supervisord重启被清空;非必须设置
;stderr_logfile_maxbytes=1MB ;
;stderr_logfile_backups=10 ;
;stderr_capture_maxbytes=1MB ;
;stderr_events_enabled=false ;
;environment=A="1",B="2" ;
;serverurl=AUTO ;
;umask=022 ;进程掩码,默认none 非必须设置
;priority=999 ;子进程启动关闭优先级,优先级低的,最先启动,关闭的时候最后关闭,默认值为999 非必须设置
;startsecs=1 ;这个选项是子进程启动多少秒之后,此时状态如果是running,则我们认为启动成功了,默认值为1,非必须设置
;startretries=3 ;当进程启动失败后,最大尝试启动次数,当超过3次后,supervisor将把此进程的状态设置为FAIL;默认值为3,非必须设置
;exitcodes=0,2 ;和上面的autorestart=unexpected对应
;stopsignal=QUIT ;进程停止信号,可以为TERM、HUP、INT、QUIT、KILL、USR1、USR2等信号,默认为TERM,当用设定的信号去干掉进程,退出嘛会被认为是expected,非必须设置
;stopwaitsecs=10 ;这个是当我们向子进程发送stopsignal信号后,到系统返回信息给supervisord,所等待的最大时间。 超过这个时间,supervisord会向该子进程发送一个强制kill的信号;默认为10秒。。非必须设置
;stopasgroup=false ; 这个东西主要用于,supervisord管理的子进程,这个子进程本身还有子进程。那么我们如果仅仅干掉supervisord的子进程的话,子进程的子进程有可能会变成孤儿进程。所以咱们可以设置可个选项,把整个该子进程的整个进程组都干掉。 设置为true的话,一般killasgroup也会被设置为true。需要注意的是,该选项发送的是stop信号默认为false。。非必须设置。。
;killasgroup=false ; 这个和上面的stopasgroup类似,不过发送的是kill信号
;user=chrism ; 如果supervisord是root启动,我们在这里设置这个非root用户,可以用来管理该program默认不设置。。。非必须设置项
;redirect_stderr=true ; 如果为true,则stderr的日志会被写入stdout日志文件中;默认为false,非必须设置
7、eventlistener
;[eventlistener:theeventlistenername] ;与program的地位是一样的,也是suopervisor启动的子进程,不过它的作用是订阅supervisord发送的event,它的名字就叫listener了,我们可以在listener里面做一系列处理,比如报警等等
;command=/bin/eventlistener ; 这个和上面的program一样,表示listener的可执行文件的路径
;process_name=%(program_name)s ; 进程名当下面的numprocs为多个的时候才需要。否则默认就OK了
;numprocs=1 ; 相同的listener启动的个数
;events=EVENT ; event事件的类型,也就是说,只有写在这个地方的事件类型才会被发送;
8、include
如果配置文件内容太多可以根据模块进行拆分
;files = /data/supervisor/*.ini
配置案例
[unix_http_server]
file=/data/supervisor/oyjblog.sock
[supervisord]
logfile=/data/supervisor/supervisor_oyjblog.log
logfile_maxbytes=100MB
logfile_backups=10
loglevle=info
pidfile=/data/supervisor/supervisor_oyjblog.pid
nodaemon=false
minfds=1024
minprocs=200
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl] serverurl=unix:///data/supervisor/oyjblog.sock
[program:oyjblog]
command=/data/www/oyjblog
directory=/data/www/
autorestart=true
redirect_stderr=True
stderr_logfile=/var/log/oyjblog.err.log
stdout_logfile=/var/log/oyjblog.out.log
stdout_logfile_maxbytes=20MB
stdout_logfile_backups=20
environment=PORT=8080
user=root
stopsignal=INT
numprocs=1
常用管理命令
supervisorctl restart ;重启指定应用 supervisorctl stop ;停止指定应用 supervisorctl start ;启动指定应用 supervisorctl restart all ;重启所有应用 supervisorctl stop all ;停止所有应用 supervisorctl start all ;启动所有应用 supervisorctl reload ;重新加载配置文件 supervisorctl update ;重启配置文件修改过的程序 supervisorctl status ;查看当前子进程状态