利用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()