使用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\n')
        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']+'\n')
        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('xxxx@xxx.com', xxxx@xxx.com, message.as_string())
        write_stdout('RESULT 2\nOK')  # transition from READY to ACKNOWLEDGED
    pass

代码中的write_stdout('READY\n')write_stdout('RESULT 2\nOK')都是一个信息标准的头尾,这里的代码是当捕捉到退出事件,把异常信息获取,并发送邮件给运维。运维就会根据错误日志排查错误,当排查完错误后在管理界面重新启动脚本即可。

posted @ 2018-12-14 10:59  魁奇路潘凤  阅读(320)  评论(0编辑  收藏  举报