Supervisor学习心得

Supervisor学习相关url:
github源码地址:https://github.com/Supervisor/supervisor
官方文档地址:http://supervisord.org/index.html
supervisor Q&A:https://stackoverflow.com/search?q=supervisor
安装包下载地址:https://pypi.python.org/pypi/supervisor

Supervisor简介:
supervisor是一个进程控制系统,采用C/S模式,允许用户在UNIX-LIKE 操作系统中去监控和控制一些进程。Supervisord作为主进程,当supervisord管理的某一个子进程异常退出时,Supervisor能够立即对其做出响应,重启该进程。supervisor还可以对进程进行组管理,批量关闭和重启,并且supervisor配置比较简单,易维护。

一、supervisor主要的组件
1、supervisord
服务端程序,主要功能是启动supervisord服务,启动supervisor管理的子进程,对进程进行管理的服务。
2、supervisorctl
客户端程序,主要功能就是管理子进程(启动/关闭/重启/状态展示等),提供shell环境进行处理。
3、web server
Web Server主要可以在界面上管理进程,Web Server其实是通过XML_RPC来实现的,可以向supervisor请求数据,也可以控制supervisor及子进程。通过配置文件中[inet_http_server]部分进行配置
4、XML_RPC
提供远程调用功能,supervisorctl和Web Server通过XML_RPC

二、supervisor部署配置
源码安装:

package_url:https://pypi.python.org/pypi/supervisor
1#yum install python python-meld3  python-setuptools
2#tar -zxf supervisor-3.3.0.tar.gz
3#cd supervisor/ && python setup.py install
4#echo_supervisord_conf > /etc/supervisord.conf(创建配置文件)
5#supervisord -c /etc/supervisord.conf(第一次加载配置文件启动supervisor)
6#supervisorctl status|reload|restart|stop|tail|exit|open|add
(如果修改了 /etc/supervisord.conf ,需要执行 supervisorctl update 来重新加载已修改的配置文件,否则不会生效)

三、常用命令简介:
1、supervisord(服务端):supervisord -c /etc/supervisord.conf(加载supervisord配置文件);启动直接使用 supervisord
2、supervisorctl update: 添加新的配置文件后,执行该命令,会把新添加的服务启动起来,且不会影响正在运行的服务
3、supervisorctl start <process_name>:启动进程 :supervisorctl start all 表示启动所有子进程
4、supervisorctl stop <process_name>: 停止子进程进程
5、supervisorctl restart <process_name>: 重启子进程
6、supervisorctl reload: 重新载入会读取最新配置并重新启动所有进程
(注:这儿要注意updatereload的区别
7、supervisorctl status:查看子进程运行状态

四、Supervisor守护进程状态及其关系:
这里写图片描述
RUNNING:表示进程正在被supervisor守护运行
STOPED:当supervisor为STOPED状态时,说明此进程已经被停止,不会自动重启,需要手动去启动或者reload;
STOPPING:守护进程在停止过程,尚未完全停止的状态,通过stopwaitsecs设置;
STARTING:表示进程正在被supervisor启动中
BACKOFF:进程启动报错,不能正常启动,达到最大重试次数的过程中回报此错误,当达到最大重试次数会转变为FATAL;
FATAL:重启次数上限还无法正常启动,如果一个自动重启进程变为FATAL,它将不会再自动重启,直到再次启动被转换状态;
EXITED:退出状态,当一个进程为此转态,它将自动重启,因此,会在EXITED与RUNNING之间转换
UNKNOW: 不能确定这个守护进程的状态,supervisord自身程序有问题;
五、配置文件详解


使用echo_supervisord_conf 生成.conf文件后,默认配置如下:

[unix_http_server]            
file=/tmp/supervisor.sock   ; socket文件的径,supervisorctl                                     用XML_RPC和supervisord通信,必须开启
;chmod=0700                 ; 定义socket文件的权限
;chown=nobody:nogroup       ; 定义socket文件的属主与属组,默认                                   为启动supervisord进程的用户及属组
;username=user              ; 使用supervisorctl连接的时候
;password=123               ; 和上面的用户名对应的密码,可以直接                                   使用明码,也可以使用SHA加密

;[inet_http_server]         ; 侦听在TCP上的socket,WebServer和远程的                              supervisorctl访问使用,默认为不开启
;port=127.0.0.1:9001        ; 监听的IP和端口,侦听所有IP用:9001或*:90                            01
;username=user              ; 访问http页的用户名
;password=123               ; 访问http页的密码
[supervisord]                ;这个主要是定义supervisord这个服务端进程                            的一些参数,必须设置项
logfile=/tmp/supervisord.log ; supervisord主进程的日志路径
logfile_maxbytes=50MB        ; 日志文件的的大小,当超过50M的时候,会生                            成一个新的日志文件。当设置为0时,表示不限制                             文件大小默认值是50M              
logfile_backups=10           ; 日志文件存储的数量,当日志文件大于设置                              的最大日志大小时(默认50M),就会生成一个                              新文件。生成文件数量大于10个时,最初的老                             文件被新文件覆盖,文件数量将一直保持为10                               个,当设置为0时,表示不限制文件的数量。
loglevel=info                ; 日志级别,有critical, error, warn, i                             nfo, debug, trace, or blather等
pidfile=/tmp/supervisord.pid ; supervisord的pid文件路径
nodaemon=false               ; 如果是true,supervisord进程将在前台运                             行,默认为false,在后台以守护进程运行
minfds=1024                  ;最少系统空闲的文件描述符,低于这个值supe                rvisor将不会启动。系统的文件描述符在这里设置cat /proc/sys/fs/file-max,默认情况下为1024
minprocs=200                 ; 最小可用的进程描述符,低于这个值supervisor也将不会正常启动
                          ulimit  -u,可查看linux下面用户的最大进程数
                          ,默认为200
;umask=022                   ; 进程创建文件的掩码
                           默认为022
;user=chrism                 ; 设置一个非root用户,当我们以root用户启动supervisord之后。
                           这儿设置的这个用户,也可以对supervisord进行管理
;identifier=supervisor       ; 这个参数是supervisord的标识符,主要是给XML_RPC用的。当你有多个
                           supervisor的时候,而且想调用XML_RPC统一管理,就需要为每个
                           supervisor设置不同的标识符了
                           默认是supervisord。。。非必需设置
;directory=/tmp              ; 这个参数是当supervisord作为守护进程运行的时候,设置这个参数的话,启动
                           supervisord进程之前,会先切换到这个目录
;nocleanup=true              ; 当为false的时候,会在supervisord进程启动的时候,把以前子进程
                           产生的日志文件(路径为AUTO的情况下)清除掉。有时候咱们想要看历史日志,当 
                           然不想日志被清除了。所以可以设置为true
                           默认是false
;childlogdir=/tmp            ; 当子进程日志路径为AUTO的时候,子进程日志文件的存放路径,
                           执行下面的这个命令看看就OK了,处理的东西就默认路径
;environment=KEY="value"     ; 设置环境变量,supervisord在linux中启动默认继承了linux的
                           环境变量,在这里可以设置supervisord进程特有的其他环境变量。
                           supervisord启动子进程时,子进程会拷贝父进程的内存空间内容,所以设置的
                           这些环境变量也会被子进程继承
;strip_ansi=false            ; 设置为true,会清除子进程日志中的所有ANSI 序列,ANSI序列就是\n,\t等

; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor]    ;这个选项是给XML_RPC用的,若要使用supervisord或者web server ,此选项必须要开启
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface 

[supervisorctl]              ;这个主要是针对supervisorctl的一些配置  
serverurl=unix:///tmp/supervisor.sock ; 这个是supervisorctl本地连接supervisord的时候,本地UNIX socket
                                    路径,注意这个是和前面的[unix_http_server]对应的
                                    默认值就是unix:///tmp/supervisor.sock
;serverurl=http://127.0.0.1:9001 ; 这个是supervisorctl远程连接supervisord的时候,用到的TCP socket路径
                               注意这个和前面的[inet_http_server]对应
                               默认就是http://127.0.0.1:9001
;username=chris              ; 用户名
;password=123                ; 密码
;prompt=mysupervisor         ; 输入用户名密码时候的提示内容
;history_file=~/.sc_history  ; 此参数跟shell中的history类似,可查看历史命令
; The below sample program section shows all possible program subsection values,
; create one or more 'real' program: sections to be able to control them under
; supervisor.

;[program:theprogramname]      ;需要管理的子进程,":"后面为子进程名,program可以设置一个或多个,一个program就是要被管理的一个子进程
;command=/bin/cat              ; 需要启动进程的命令路径了,可以带参数:如/home/xxx -x xxx,必须设置项
;process_name=%(program_name)s ; 进程名,如果下面numprocs参数为1的话,就不用设置这个参数了,它默认值%(program_name)s也就是上面的那个program冒号后面的名字,但是如果numprocs为多个的话
;numprocs=1                    ; 启动进程的数目。当不为1时,就是进程池的概念,注意process_name的设置,默认为1
;directory=/tmp                ; 进程运行前,会先切换到这个目录
;umask=022                     ; 进程掩码
;priority=999                  ; 子进程启动关闭优先级,优先级低的,最先启动,关闭的时候最后关闭
;autostart=true                ; 是true的话,子进程将在supervisord启动后被自动启动
;autorestart=unexpected        ; 设置子进程挂掉后是否自动重启,有三个选项,false,unexpected和true。如果为false的时候,无论什么情况下,都不会被重新启动,如果为unexpected,只有当进程的退出码不在下面的exitcodes里面定义的退出码的时候,才会被自动重启。当为true的时候,只要子进程挂掉,将会被无条件的重启
;startsecs=1                   ;此选项为子进程启动多少秒之后,此时状态如果是running,则我们认为启动成功
;startretries=3                ; 当进程启动失败后,最大尝试启动的次数,当超过3次后,supervisor将把此进程的状态置为FATAL
;exitcodes=0,2                 ; 注意和上面的的autorestart=unexpected对应。。exitcodes里面的定义退出码是expected的。
;stopsignal=QUIT               ; 进程停止信号,可以为TERM, HUP, INT, QUIT, KILL, USR1, or 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日志文件中
;stdout_logfile=/xxx/path        ; 子进程的stdout的日志路径,可以指定路径,AUTO,none等三个选项,设置为none的话,将没有日志产生。设置为AUTO的话,将随机找一个地方生成日志文件,而且当supervisord重新启动的时候,以前的日志文件会被清空。当 redirect_stderr=true的时候,sterr也会写进这个日志文件
;stdout_logfile_maxbytes=1MB   ; 日志文件最大大小,和[supervisord]中定义的一样
;stdout_logfile_backups=10     ; 和[supervisord]定义的一样。默认10
;stdout_capture_maxbytes=1MB   ; 设定capture管道的大小,当值不为0的时候,子进程可以从stdout发送信息,而supervisor可以根据信息,发送相应的event。默认为0,为0的时候表示关闭管道
;stdout_events_enabled=false   ; 当设置为ture的时候,当子进程由stdout向文件描述符中写日志的时候,将触发supervisord发送PROCESS_LOG_STDOUT类型的event
;stderr_logfile=/a/path        ; 这个东西是设置stderr写的日志路径,当redirect_stderr=true。这个就不用设置了。因为它会被写入stdout_logfile的同一个文件中默认为AUTO,也就是随便找个地存,supervisord重启被清空
;stderr_logfile_maxbytes=1MB   ; stdrr日志输出最大大小
;stderr_logfile_backups=10     ; stddr日志输出文件个数
;stderr_capture_maxbytes=1MB   ; 这个一样,和stdout_capture一样。 默认为0,关闭状态
;stderr_events_enabled=false   ; 这个也是一样,默认为false
;environment=A="1",B="2"       ; 这个是该子进程的环境变量,和别的子进程是不共享的
;serverurl=AUTO                ; 

; The below sample eventlistener section shows all possible
; eventlistener subsection values, create one or more 'real'
; eventlistener: sections to be able to handle event notifications
; sent by supervisor.

;[eventlistener:theeventlistenername] ;此参数和program的地位是一样的,也是suopervisor启动的子进程,不过它干的活是订阅supervisord发送的event。它的名字就叫listener了。我们可以在listener里面做一系列处理,比如报警等等
;command=/bin/eventlistener    ; 这个和上面的program一样,表示listener的可执行文件的路径
;process_name=%(program_name)s ; 这个也一样,进程名,当下面的numprocs为多个的时候才需要
;numprocs=1                    ; 相同的listener启动的个数
;events=EVENT                  ; event事件的类型,也就是说,只有写在这个地方的事件类型。才会被发送
;buffer_size=10                ; 这个是event队列缓存大小,当buffer
                             超过10的时候,最旧的event将会被清除,并把新的event放进去,默认值为10
;directory=/tmp                ; 进程执行前,会切换到这个目录下执行
                             默认为不切换
;umask=022                     ; 掩码,默认为none
;priority=-1                   ; 启动优先级,默认-1
;autostart=true                ; 是否随supervisord启动一起启动,默认true
;autorestart=unexpected        ; 是否自动重启,和program一个样,分true,false,unexpected等,注意
                              unexpected和exitcodes的关系
;startsecs=1                   ; 也是一样,进程启动后跑了几秒钟,才被认定为成功启动,默认1
;startretries=3                ; 失败最大尝试次数,默认3
;exitcodes=0,2                 ; 进程退出码,
;stopsignal=QUIT               ; 停止进程的信号,默认为TERM,比如设置为QUIT,那么如果QUIT来干这个进程,那么会被认为是正常维护,退出码也被认为是expected中的
;stopwaitsecs=10               ; max num secs to wait b4 SIGKILL (default 10)
;stopasgroup=false             ; send stop signal to the UNIX process group (default false)
;killasgroup=false             ; SIGKILL the UNIX process group (def false)
;user=chrism                   ;设置普通用户,可以用来管理该listener进程,默认为空
;redirect_stderr=true          ; 为true的话,stderr的log会并入stdout的log里面默认为false
;stdout_logfile=/a/path        ; 日志输出路径
;stdout_logfile_maxbytes=1MB   ; 日志输出最大大小
;stdout_logfile_backups=10     ; 日志输出文件个数
;stdout_events_enabled=false   ; 
;stderr_logfile=/a/path        ;设置stderr写的日志路径
;stderr_logfile_maxbytes=1MB   ; stdrr日志输出最大大小
;stderr_logfile_backups=10       ; 这stddr日志输出文件个数
;stdout_events_enabled=false   ; 
;stderr_events_enabled=false   ; 
;environment=A="1",B="2"       ; 这个是该子进程的环境变量
                               默认为空。。。非必须设置
;serverurl=AUTO                ; override serverurl computation (childutils)

; The below sample group section shows all possible group values,
; create one or more 'real' group: sections to create "heterogeneous"
; process groups.

;[group:thegroupname]  ;programs分组管理,划分到组里面的program,可以批量操作我们可以对组名进行统一的操作。 注意:program被划分到组里面之后,原来的配置从supervisor的配置文件里将失效,supervisor只会对组进行管理,而不再会对组里面的单个program进行管理了
;programs=progname1,progname2  ; 组成员,用逗号隔开,这个是个必须的设置项
;priority=999                  ; 优先级,相对于组和组之间的优先级

; The [include] section can just contain the "files" setting.  This
; setting can list multiple files (separated by whitespace or
; newlines).  It can also contain wildcards.  The filenames are
; interpreted as relative to this file.  Included files *cannot*
; include files themselves.

;[include]                         ;加载外部配置文件,然后include过来                                    ,后面详细介绍
;files = relative/directory/*.ini

六、子进程管理配置
1、添加守护配置:
[program:app_service]
command=/usr/local/app_service/ -c app-service.conf
autostart=true
autorestart=true
startsecs=3
stdout_logfile=/tmp/supervisor.log
2、web端配置(默认)
Web Server主要可以在界面上管理进程,Web Server其实是通过XML_RPC来实现的,可以向supervisor请求数据,也可以控制supervisor及子进程。配置在[inet_http_server]块里面,设置完可在浏览器输入http://172.19.0.34:9001管理
[inet_http_server]
port=172.19.0.34:9001
username=user
password=123
3、配置多个进程:
process_name=%(program_name)s-811%(process_num)d ; (多个进程名,如service+port1,service+port2)
process_name expr (default %(program_name)s)
numprocs=4 ; number of processes copies to start (def 1)
numprocs_start=1
4、加载外部配置文件:
[include]
files = /tmp/*.ini
(可将不同的进程配置写到多个文件中,通过include加载,适用场景:当需要管理的进程比较多时,写到一个文件比较臃肿supervisor,修改查询比较繁琐,且写到不同的文件后期修改单个进程配置较为方便,减少对其他进程的误操作率)
5、分组管理
[group:wms] ;组名
programs=wms-service,wms-task ;单个子进程,用逗号隔开
priority=999,启动时通过通配符进行管理,也可以组的方式单个管理,如:supervisorctl start wms:* ,supervisorctl stop wms:wms-task

七、supervisor的优缺点
优点:
1、管理你的worker进程,让你的进程随机器启动而启动,当某个worker宕掉时自动重启该worker
2、采用kill -9强制杀掉supervisord进程,那么supervisor管理的worker将由init进程管理,并继续运行,不会关闭,并且能正常服务于client的请求。
3、采用kill杀掉supervisord进程,那么supervisor管理的所有worker将关闭
4、supervisor可以加载外部配置文件,直接作为进程运行([include])。
5、supervisor可以为子进程单独加载环境变量
缺点:
1、只能监控前台程序,非守护进程(nodaemon),daemon程序则不能监控(报错:FATAL Exited too quickly (process log may have details),需要注意的是,我们的command只能是那种在终端运行的进程,不能是守护进程。比如说command=service httpd start,httpd这个进程被linux的service管理了,我们的supervisor再去启动这个命令这已经不是严格意义的子进程了
2、supervisord仅仅只能kill掉自己创建的进程,而不能kill管理的子进程自己创建的子进程;

八、使用中遇到的supervisor 问题(陆续补充中):
1、当supervisord进程挂掉后,重新启动会出现两个相同app进程(原因:supervisord进程挂掉后,supervisor管理的app worker将由init进程管理,并继续运行,不会关闭;而supervisord再次启动时,会重启守护的所有进程,导致出现两个相同进程,如不手动kill,会如此一直重复增加相同进程)
避免方式:在关闭或者杀死supervisord进程时,切记使用kill命令(正常杀死进程),而不要使用kill -9(强制杀死),由于两个命令发送的SIGN信号不同,导致处理进程的方式也不一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值