利用supervisorctl listener来设定监听守护2.0

在过了几个月的进程监听以后,还是发现了一些问题。

不仅是团队在从企业微信到飞书上发送机器人。

 

也是从进程监听上的一些问题。目前的话可以监听的只有当下的这个Python的进程。

但是实际上却不满足我的需求的,因为服务器的进程重要的都有好几个。

其他进程挂的时候又没有办法告知,进程又是用GO写的(还没有开始接触GO)

不过还是有其他的办法去监听到进程的状态,那就是利用supervisorctl status来判断返回的状态如何,然后继续做监听处理。

 

不过也没有做太多的修改,先把能符合需求的代码放上来吧。

后面有时间再优化吧,就先这样。

#!/usr/bin/ python
# -*- coding: utf-8 -*-
# @Author  : 黑羽青衣
# @File    : new_listener.py

import sys
import os
import requests
import time
from datetime import date, time, datetime, timedelta
from supervisor import childutils
from optparse import OptionParser

def write_stdout(s):
    sys.stdout.write(s)
    sys.stdout.flush()

def write_stderr(s):
    sys.stderr.write(s)
    sys.stderr.flush()

# 定义异常,没啥大用其实
class CallError(Exception):
    def __init__(self, value):
        self.value = value

    def __str__(self):
        return repr(self.value)


# 定义处理event的类
class ProcessesMonitor():
    def __init__(self):
        self.stdin = sys.stdin
        self.stdout = sys.stdout

    def WeChat(self, msg):
        webhook = 输入你自己的飞书webhook
        header = {"Content-Type": "application/json"}
        if not msg:
            return
        else:
            data = {
                "msg_type": "text",
                "content": {
                    "text": msg,
                }
            }
            print(data)
            r = requests.post(url=webhook, headers=header, json=data)
            print(r)
            if r.status_code == 200:
                print("发送成功")
            else:
                print("发送失败,返回码为:" + str(r.status_code) + "\n")

    def runforever(self, day, hours, min, sec):
        now = datetime.now()
        strnow = now.strftime('%Y-%m-%d %H:%M:%S')
        # print("now:", strnow)
        period = timedelta(days=0, hours=12, minutes=0, seconds=0)
        next_time = now + period
        strnext_time = next_time.strftime('%Y-%m-%d %H:%M:%S')
        # print("next run:", strnext_time)
        # 进行一个定时的检查策略,这里也是为了避免报警次数过多,暂时采用的做法
        while True:
            iter_now = datetime.now()
            iter_now_time = iter_now.strftime('%Y-%m-%d %H:%M:%S')
            if str(iter_now_time) == str(strnext_time):
                print("start work: %s" % iter_now_time)
                self.listener()
                iter_time = iter_now + period
                strnext_time = iter_time.strftime('%Y-%m-%d %H:%M:%S')
                print("next_iter: %s" % strnext_time)


    def listener(self):
        file1 = os.popen('sudo /usr/bin/supervisorctl status')
        for line in file1.readlines():
            # 获取服务名&服务状态
            # print('line = %s' % line)
            ser_name = line.split()[0].strip().split(":")[0]
            # print('ser_name = %s' % ser_name)
            ser_res = line.split()[1].strip()
            # 判断服务运行状态,1为成功,0为失败
            if ser_res == 'RUNNING' or ser_res == "STARTING":
                ser_res = '1'
            else:
                msg = "请检查[进程名:%s][运行状态: %s] " % (ser_name, ser_res)
                self.WeChat(msg)


def main():
    parser = OptionParser()
    if len(sys.argv) == 2:
        if sys.argv[1] == '-h' or sys.argv[1] == '--help':
            print(__doc__)
            sys.exit(0)
    # (options, args) = parser.parse_args()
    # 下面这个,表示只有supervisord才能调用该listener,否则退出
    if not 'SUPERVISOR_SERVER_URL' in os.environ:
        try:
            raise CallError("%s must be run as a supervisor event" % sys.argv[0])
        except CallError as e:
            write_stderr("Error occurred,value: %s\n" % e.value)
        return
    prog = ProcessesMonitor()
    prog.runforever(0,12,0,0)


if __name__ == '__main__':
    main()

 

posted @ 2021-11-04 16:10  黑羽青衣  阅读(61)  评论(0编辑  收藏  举报