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秒执行一次

钉钉截图:

 

posted @ 2020-12-16 17:59  努力乄小白  阅读(565)  评论(0编辑  收藏  举报