python-自动化监控进程发钉钉报警
#!/usr/bin/python3.7 import psutil import time import os, requests import json monitor_name = {'nginx','supervisord'} monitor_map = { 'httpd': 'systemctl start nginx', 'supervisord': 'systemctl restart supervisord' } # 钉钉自己人hook_url url = 'https://oapi.dingtalk.com/robot/send?access_token=f4de0e432f10ec92d7ab59b09284f6a6e0c1785cfa6e17dc6604e70f92a33707' # 当前时间 current_time = time.strftime('%Y-%m-%d-%H:%M:%S', time.localtime(time.time())) while True: # 字典,无序 proc_dict = {} # 集合,作用是去重,数据唯一,无序 proc_name = set() for p in psutil.process_iter(attrs=['pid', 'name']): proc_dict[p.info['pid']] = p.info['name'] proc_name.add(p.info['name']) print(proc_dict) print('\n\n---------\n') print(proc_name) # 网卡,可以得到网卡属性,连接数,当前流量等信息 # net = psutil.net_io_counters() # bytes_sent = '{0:.2f} Mb'.format(net.bytes_recv / 1024 / 1024) # bytes_rcvd = '{0:.2f} Mb'.format(net.bytes_sent / 1024 / 1024) # print(u"网卡接收流量 %s 网卡发送流量 %s" % (bytes_rcvd, bytes_sent)) # print('-----------------------------进程信息-------------------------------------') # 查看系统全部进程 # for pnum in psutil.pids(): # p = psutil.Process(pnum) # print(u"进程名 %-20s 内存利用率 %-18s 进程状态 %-10s 创建时间 %-10s " \ # % (p.name(), p.memory_percent(), p.status(), p.create_time())) proc_stop = monitor_name - proc_name if proc_stop: for p in proc_stop: # 取出每一个没启动的服务名 p_status = '停止' p_name = p data = { "msgtype": "markdown", "markdown": { "title": "监控信息", "text": "#### %s \n" % current_time + ">##### 服务名 %s \n" % p_name + ">##### 状态 %s \n" % p_status + "> ###### 正在尝试重新启动 \n" }} headers = {'Content-Type': 'application/json ;charset=utf-8'} send_data = json.dumps(data).encode('utf-8') # 把字典类型的数据变成json的数据类型,这样才能支持中文 requests.post(url=url, data=send_data, headers=headers) os.system(monitor_map[p]) proc_name = set() for p_new in psutil.process_iter(attrs=['pid', 'name']): proc_name.add(p_new.info['name']) if p in proc_name: p_status = '启动' data = { "msgtype": "markdown", "markdown": { "title": "监控信息", "text": "#### %s \n" % current_time + ">##### 服务名 %s \n" % p_name + ">##### 状态 %s \n" % p_status + " ###### 重启成功 \n" }} headers = {'Content-Type': 'application/json ;charset=utf-8'} send_data = json.dumps(data).encode('utf-8') # 把字典类型的数据变成json的数据类型,这样才能支持中文 requests.post(url=url, data=send_data, headers=headers) else: p_status = '停止' data = { "msgtype": "markdown", "markdown": { "title": "监控信息", "text": "#### %s \n" % current_time + ">##### 服务名 %s \n" % p_name + ">##### 状态 %s \n" % p_status + " ###### 启动失败 \n" }} headers = {'Content-Type': 'application/json ;charset=utf-8'} send_data = json.dumps(data).encode('utf-8') # 把字典类型的数据变成json的数据类型,这样才能支持中文 requests.post(url=url, data=send_data, headers=headers) time.sleep(2)
while 死循环,每2秒执行一次
钉钉截图: