Supervisor简介Supervisor是一个用Python开发的通用进程管理程序。它可以将一个普通的命令行进程变成后台守护进程,监控进程状态,异常退出时自动重启。它使用fork/exec将这些托管进程作为主管的子进程启动。这样只需要在supervisor配置文件中写上要管理的进程的可执行文件的路径即可。也实现了当子进程挂掉的时候,父进程可以准确的获取到子进程挂掉的信息,并且可以选择是否自己启动和报警。Supervisor还提供了一个功能,可以为supervisord或者每个子进程设置一个非root用户,这个用户可以管理它对应的进程。今天要说的不是主管。关于supervisor的使用百度了很多。我不会在这里详细介绍。今天的重点是主管事件监控。Event&ListenerEvent是Supervisor3.0引入的高级特性。如果只是简单的用Supervisor来管理进程,就不需要了解Event了。但是,如果要监控Supervisor管理的进程的各种状态(如:启动、退出、失败、退出状态码……)并支持告警,则需要了解Event。使用Supervisor的Event&Listener功能订阅异常退出事件并进行告警处理。Supervisor官方对其Event机制的描述是:一个流程监控/通知框架。该机制主要通过事件监听器订阅事件通知来实现。当Supervisor管理的进程有特定的行为时,Supervisor会自动发送相应类型的事件。即使没有配置监听器,也会发送这些事件;如果配置了侦听器并侦听此类事件,则侦听器将接收到该事件。事件监听器需要自己实现,作为supervisorlikeprogram的子进程运行。具体配置实现配置事件监听器supervisor事件监听器由配置文件中的[eventlistener:x]指定。关于配置中允许的键,supervisor[eventlistener:x]几乎与supervisor[program:x]完全相同,除了Supervisor不尊重事件监听器进程的“捕获模式”输出(即事件监听器不能是PROCESS_COMMUNICATIONS_EVENT事件生成器).因此,在事件侦听器的配置中指定stdout_capture_maxbytes或stderr_capture_maxbytes是错误的。可以放置在配置文件中的事件侦听器部分的数量没有人为限制。vim/etc/supervisord.d/eventlistener.ini[eventlistener:mylistener]command=/opt/my_custom_listener.py;自定义监控程序events=PROCESS_STATE_EXITED,PROCESS_STATE_FATAL,TICK_60;监控事件;thefollowingconfigurationand`[program:x]`完全一样autostart=trueautorestart=truelog_stdout=truelog_stderr=truestdout_logfile=/opt/supervisor_event_exited-stdout.logstdout_logfile_maxbytes=50MBstdout_logfile_backups=3buffer_size=10stderr_logfile=/opt/supervisor_event_exited-stderr.logstderr_logfile_maxbytes=50MBstderr_logfile_backups=3配置监听器脚本。vim/opt/my_custom_listener.py#!/usr/bin/envpython#-*-coding:utf-8-*-importsysfromsupervisorimportchildutilsdefwrite_stdout(s):#只有eventlistener协议消息可以发送到stdoutsys。stdout.write(s)sys.stdout.flush()defwrite_stderr(s):sys.stderr.write(s)sys.stderr.flush()defmain():while1:#transitionfromACKNOWLEDGEDtoREADYwrite_stdout('READY\n')#读取标题行并将其打印到标准错误line=sys.stdin.readline()write_stderr(line)#读取事件负载并将其打印到标准错误headers=dict([x.split(':')forxinline.split()])data=sys.stdin.read(int(headers['len']))write_stderr(data)#transitionfromREADYtoACKNOWLEDGEDwrite_stdout('RESULT2\nOK')#使用supervisorchildutils解析头,payload=childutils.listener.wait(sys.stdin,sys.stdout)pheaders,pdata=childutils.eventdata(payload+'\n')#当程序的退出代码为对应配置中的exitcodes值时,expected=1;否则为0ifint(pheaders.get('expected',1)):childutils.listener.ok(sys.stdout)continueelse:#0,异常退出,根据pheaders的值发送告警处理#################################你的自定义发送警报逻辑#withopen('/opt/sup.log','a')asf:#在这里写入文件作为警报的简单模拟f.write(str(pheaders))f.write(str(pdata))f.write('\n')##############################将“RESULT\nOK”写入stdout,并进入下一个循环childutils.listener.ok(sys.stdout)if__name__=='__main__':main()这里的告警方法可以自己定义,可以是email,也可以通过webhook调用im接口告警其实supervisor自带了一个监控工具——superlance。superlancesuperlance是一系列基于supervisor事件机制的命令行工具集。它实现了很多supervisor本身没有实现的实用进程监控和管理功能,包括内存监控、http接口监控、邮件和短信通知机制等。同样,superlance本身也是用python写的。安装由于superlance是一个python包,所以安装起来非常简单。可以通过easy_install或者pip轻松安装:easy_installsuperlancepipinstallsuperlance当然你也可以在github(https://github.com/Supervisor/superlance)上获取最新的源码并安装。pythonsetup.pyinstall安装完成后执行如下httpok命令。如果该命令存在,说明superlance已经正常安装。superlance组件superlance是命令行工具的集合,包括以下命令:httpok定时向HTTP接口发起GET请求,根据请求是否成功判断进程是否正常,并重启这个过程如果不正常。crashmail当进程意外退出时发送电子邮件警报。当进程的内存使用量超过设置的阈值时,memmon会发送电子邮件警报。crashmailbatch类似于crashmail的alarm,但是会把一段时间内的邮件合并发送,避免邮件轰炸。fatalmailbatch当一个进程多次启动失败时,会进入FATAL状态,此时发送邮件告警。Crashmailbatch还将执行合成警报。crashsms当进程意外退出时发送短信告警,这条短信也是通过邮件网关发送的。邮件提醒Superlance使用sendmail发送邮件,所以需要安装sendmail。安装完成后aptinstallsendmail配置superlance。cat/etc/supervisor/conf.d/redis.conf[program:redis]command=/usr/local/redis/bin/redis-server/home/redis/etc/redis.confdirectory=/usr/local/redis/bin/user=redisautostart=trueautorestart=true#startsecs=30stopwaitsecs=1stopsignal=TERMredirect_stderr=true[eventlistener:redis_monitor]command=crashmail-predis-mxxx@qq.comevents=PROCESS_STATE_EXITEDredirect_stderr=false首先配置redis进程启动项目,然后配置了一个名为redis_monitor的事件监听器,它接受来自主管的PROCESS_STATE_EXITED事件并触发crashmail命令行调用。PROCESS_STATE_EXITED是一个supervisor监控项对应的进程意外退出时会触发的事件,当进程意外退出时会通知crashmail。命令参数中的-p参数配置crashmail只响应名为redis的监控项,而-m参数配置crash邮件发送到的地址。灵活运用超级枪,可以满足各种报警需求,实现各种过程监控。
