python-自動化監控程序發釘釘報警
阿新 • • 發佈:2020-12-16
#!/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秒執行一次
釘釘截圖: