supervisor
:::info{title="title"} Supervisor是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统,本文给大家介绍在python3中使用Supervisor的方法,感兴趣的朋友一起看看吧 :::
supervisor介绍
首先,介绍一下supervisor。Supervisor(http://supervisord.org) 是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制 环境:centos7.4
安装supervisor
因为是python开发的一个库,可以直接用pip来安装,很方便。 supervisor安装完成后会生成三个执行程序:supervisortd、supervisorctl、echo_supervisord_conf,分别是supervisor的守护进程服务(用于接收进程管理命令)、客户端(用于和守护进程通信,发送管理进程的指令)、生成初始配置文件程序。
设置环境变量
根据自己系统情况添加python环境变量
配置supervisor
创建目录。初始化配置文件
主配置文件参数
管理一个进程
把所有被管理的进程配置文件都放在同一个目录,主配置文件包含进去。
新建一个配置文件
编写一个输出日期的脚本
这时候就会监听/tmp/1.sh这个脚本进程,如果不存在就会去执行启动
监听nginx服务状态
刚开始有个坑,command = /usr/local/nginx/sbin/nginx 我是这样写的 结果就一直启动nginx 因为这样的话 是后台运行的nginx,然而supervisor 不能管理后台运行进程,所以把nginx daemon off 守护关掉,就让他阻塞在前台bash运行,方便supervisor来管理。
supervisor配置文件详解
:::tip{title="部分配置"} 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
:::
启动supervisor
有时候kill进程之后需要释放连接
web界面管理 开启web访问
此处需要注意将 [inet_http_server] 前边的注释也要去掉
supervisorctl的命令
supervisord : 启动supervisor
supervisorctl reload :修改完配置文件后重新启动supervisor
supervisorctl status :查看supervisor监管的进程状态
supervisorctl start 进程名 :启动XXX进程
supervisorctl stop 进程名 :停止XXX进程
supervisorctl stop all:停止全部进程,注:start、restart、stop都不会载入最新的配置文件。
supervisorctl update:根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启
superlance介绍
superlance就是基于supervisor的事件机制实现的一系列命令行的工具集,它实现了许多supervisor本身没有实现的实用的进程监控和管理的特性,包括内存监控,http接口监控,邮件和短信通知机制等。同样的,superlance本身也是使用python编写的 superlance的组件 superlance是一系列命令行工具的集合,其包括以下这些命令:
httpok 通过定时对一个HTTP接口进行GET请求,根据请求是否成功来判定一个进程是否处于正常状态,如果不正常则对进程进行重启。
crashmail 当一个进程意外退出时,发送邮件告警。
memmon 当一个进程的内存占用超过了设定阈值时,发送邮件告警。
crashmailbatch 类似于crashmail的告警,但是一段时间内的邮件将会被合成起来发送,以避免邮件轰炸。
fatalmailbatch 当一个进程没有成功启动多次后会进入FATAL状态,此时发送邮件告警。与crashmailbatch一样会进行合成报警。
crashsms 当一个进程意外退出时发送短信告警,这个短信也是通过email网关来发送的。
:::tip{title="提示"} 1、当supervisord启动的时候,如果我们的listener配置为autostart=true的话,listener就会作为supervisor的子进程被启动。 2、listener被启动之后,会向自己的stdout写一个"READY"的消息,此时父进程也就是supervisord读取到这条消息后,会认为listener处于就绪状态。 3、listener处于就绪状态后,当supervisord产生的event在listener的配置的可接受的events中时,supervisord就会把该event发送给该listener。 4、listener接收到event后,我们就可以根据event的head,body里面的数据,做一系列的处理了。我们根据event的内容,判断,提取,报警等等操作。 5、该干的活都干完之后,listener需要向自己的stdout写一个消息"RESULTnOK",supervisord接受到这条消息后。就知道listener处理event完毕了。 :::
Supervisord支持的Event(事件)
PROCESS_STATE 进程状态发生改变 PROCESS_STATE_STARTING 进程状态从其他状态转换为正在启动(Supervisord的配置项中有startsecs配置项, 是指程序启动时需要程序至少稳定运行x秒才认为程序运行正常,在这x秒中程序状态为正在启动) PROCESS_STATE_RUNNING 进程状态由正在启动转换为正在运行 PROCESS_STATE_BACKOFF 进程状态由正在启动转换为失败 PROCESS_STATE_STOPPING 进程状态由正在运行转换为正在停止 PROCESS_STATE_EXITED 进程状态由正在运行转换为退出 PROCESS_STATE_STOPPED进程状态由正在停止转换为已经停止(exited和stopped的区别是exited\是程序自行退出,而stopped为人为控制其退出) PROCESS_STATE_FATAL 进程状态由正在运行转换为失败 PROCESS_STATE_UNKNOWN 未知的进程状态 REMOTE_COMMUNICATION 使用Supervisord的RPC接口与Supervisord进行通信 PROCESS_LOG 进程产生日志输出,包括标准输出和标准错误输出 PROCESS_LOG_STDOUT 进程产生标准输出 PROCESS_LOG_STDERR 进程产生标准错误输出 PROCESS_COMMUNICATION 进程的日志输出包含 和 PROCESS_COMMUNICATION_STDOUT 进程的标准输出包含 和 PROCESS_COMMUNICATION_STDERR进程的标准错误输出包含 和 SUPERVISOR_STATE_CHANGE_RUNNING Supervisord 启动 SUPERVISOR_STATE_CHANGE_STOPPING Supervisord 停止 TICK_5 每隔5秒触发 TICK_60 每隔60秒触发 TICK_3600 每隔3600触发 PROCESS_GROUP Supervisord的进程组发生变化 PROCESS_GROUP_ADDED 新增了Supervisord的进程组 PROCESS_GROUP_REMOVED 删除了Supervisord的进程组\
安装superlance
也是python程序,直接pip 安装
superlance实战
在实际配置supervisor使用superlance之前,首先要安装sendmail,superlance使用这个命令行工具来发送email,利用各种包管理工具都可以简单的安装: 建议通过yum安装
发邮件测试一下
现在要做的就是配置一个supervisor配置文件,来一直监听进程的状态变化
或
:::tip{title="提示"} command参数中 -p 参数配置了crashmail只会对名为redis的监控项作出响应,而 -m 参数中则配置了崩溃邮件会被发送到的地址,-a 监控所有项
crashmail是一个主管“事件监听器”,用于订阅PROCESS_STATE_EXITED事件。当crashmail 收到该事件并且转换是"意外的(not expected)"时,crashmail 会将电子邮件通知发送到已配置的地址
events=PROCESS_STATE_EXITED,PROCESS_STATE_STOPPED,PROCESS_STATE_FATAL,PROCESS_LOG_STDERR 多个事件时,用逗号隔开
PROCESS_STATE_EXITED是在一个supervisor的监控项对应的进程意外退出时会触发的事件,这就使得一个进程出现意外退出的情况下会通知到crashmail。 :::
添加好一个进程配置文件后
重启一下
整体示例代码
这有帮助吗?