使用supervisor监控服务器持续运行的文件
Posted liudamu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用supervisor监控服务器持续运行的文件相关的知识,希望对你有一定的参考价值。
在做数据传输的时候需要让python脚本不断运行,如果脚本突然中断而来不及造成的影响很不好。虽然可以在每个脚本中加上try..catch,但这样代码重复,维护起来挺费劲。本人也尝试使用python的subprocess来管理,但subprocess只能做到发现脚本中断后立即重启,而不能人为手动重启(有时候中断是因为出现exception,需要排查)。后来发现supervisor可以使用,就尝试安装supervisor来用一下。
安装文档很容易搜到,最主要是supervisor只能由python2来安装,需要找到服务器中的python2文件来安装。
配置方案也比较容易,有个细节就是所有的配置语句后面不能紧挨着分号‘;‘,需要留一点空,否则会出现异常。
supervisor提供了web界面查看正在管理的脚本,可以从界面查看脚本启动重启等等。
最后supervisor提供了监听事件功能,主要建立监听配置,当监听到脚本中断退出的事件,把事件信息传输给自建的python脚本进行处理。例如本人自建的python脚本代码如下:
if not ‘SUPERVISOR_SERVER_URL‘ in os.environ: print("%s must be run as a supervisor listener." % sys.argv[0]) return while True: # echo ‘READY‘ and wait for event for stdin. write_stdout(‘READY ‘) line = sys.stdin.readline() # read header line from stdin headers = dict([x.split(‘:‘) for x in line.split()]) data = sys.stdin.read(int(headers[‘len‘])) # read the event payload # write_stdout(‘事件名:‘+headers[‘eventname‘]+‘ ‘) if headers[‘eventname‘] == ‘PROCESS_STATE_EXITED‘: pheaders, pdata = parseData(data) process_name = pheaders[‘processname‘] msg = ‘进程%s(PID: %s)异常退出,请检查进程状态.‘ % (process_name, pheaders[‘pid‘]) smtp = mail_config() msg = "<p>错误原因:</p><b>" + msg + "</b>" message = MIMEText(msg, ‘html‘, ‘utf-8‘) message[‘From‘] = Header("supervisor监控脚本", ‘utf-8‘) # 发送者 message[‘To‘] = Header("开发成员", ‘utf-8‘) # 接收者 subject = ‘supervisor监控异常‘ message[‘Subject‘] = Header(subject, ‘utf-8‘) smtp.sendmail(‘[email protected]‘, [email protected], message.as_string()) write_stdout(‘RESULT 2 OK‘) # transition from READY to ACKNOWLEDGED pass
代码中的write_stdout(‘READY ‘)和write_stdout(‘RESULT 2 OK‘)都是一个信息标准的头尾,这里的代码是当捕捉到退出事件,把异常信息获取,并发送邮件给运维。运维就会根据错误日志排查错误,当排查完错误后在管理界面重新启动脚本即可。
以上是关于使用supervisor监控服务器持续运行的文件的主要内容,如果未能解决你的问题,请参考以下文章
使用 Supervisor 配置 Laravel 运行队列处理器