Loading

Python脚本——监控系统脚本

Python脚本——监控系统脚本

监测系统的CPU、内存、硬盘、网卡和服务端口信息,并发送邮件信息

  • Linux和Windows都可以使用
  • 使用psutil模块获取检测数据
  • 字典services:定义端口数据
  • 方法send_mail:定义了邮件信息
    # 运行输出信息
    ------------------------------
    服务状态:
	nginx:		Off!
	php:		Off!
	mysql:		Off!
	redis:		Off!
	zabbix:		Off!

    ------------------------------
    CPU使用率:		23.00%
    ------------------------------
    内存使用率:	32.80%
    内存总容量:	16227M
    已使用内存:	5317M
    ------------------------------
    磁盘使用率:	54.30%
    磁盘总容量:	376Gb
    已使用磁盘:	204Gb
    ------------------------------
    网卡发送流量:	113Mb
    网卡接收流量:	2184Mb
    ------------------------------

import psutil  # 载入psutil模块
import smtplib  # 载入smtplib模块
from email.mime.text import MIMEText
from email.header import Header

# 定义检查的服务名称和端口
services = {
    'nginx': 80,
    'php': 9000,
    'mysql': 3306,
    'redis': 6379,
    'zabbix': 10050,
}

# 获取cpu信息
def cpu_info():  # 定义CPU使用率函数
    cpu = '%.2f%%' % psutil.cpu_percent(1)  # 截取1秒内cpu的使用率。
    return cpu
    # %.2f表示输出浮点数并保留两位小数。%%表示直接输出一个%。

# 获取内存信息
def mem_info():  # 定义内存使用率
    mem = psutil.virtual_memory()
    mem_per = '%.2f%%' % mem[2]
    mem_total = str(int(mem[0] / 1024 / 1024)) + 'M'
    mem_used = str(int(mem[3] / 1024 / 1024)) + 'M'
    info = {
        'mem_per': mem_per,
        'mem_total': mem_total,
        'mem_used': mem_used
    }  # 建立字典,方便后边调用值
    return info

# 获取硬盘信息
def disk_info():
    all_disk = psutil.disk_usage('/')
    disk_per = '%.2f%%' % all_disk[3]
    disk_total = str(int(all_disk[0] / 1024 / 1024 / 1024)) + 'Gb'
    disk_used = str(int(all_disk[1] / 1024 / 1024 / 1024)) + 'Gb'
    info = {
        'disk_per': disk_per,
        'disk_total': disk_total,
        'disk_used': disk_used,
    }
    return info

# 获取网卡信息
def network_info():
    network = psutil.net_io_counters()
    network_sent = str(int(network[0] / 1024 / 1024)) + 'Mb'
    network_resv = str(int(network[1] / 1024 / 1024)) + 'Mb'
    info = {
        'network_sent': network_sent,
        'network_resv': network_resv
    }
    return info

# 获取服务端口信息
def port_check():
    info = dict.fromkeys(services.keys(), 'Off!')
    for i in services.items():
        for j in psutil.net_connections():
            if j.status == 'LISTEN' and j.laddr.port == i[1]:
                info[i[0]] = 'ok'
    return info

# 放送报警邮件
def send_mail(message):  # 定义发邮件函数
    a = ['xxxxxx@qq.com', ]  # 定义一个列表a为接收方
    sender = 'xxxxxx@qq.com'  # 发送方
    for i in a:
        receiver = i
        subject = '报警'
        username = 'xxxxxx@qq.com'  # 发送方使用的账户名
        password = 'xxxxxxxxxxxxx'  # 发送方的授权码密码
        msg = MIMEText(message, 'plain', 'utf-8')
        msg['Subject'] = Header(subject, 'utf-8')
        msg['From'] = sender
        msg['To'] = receiver
        smtp = smtplib.SMTP_SSL('smtp.qq.com')
        smtp.ehlo('smtp.qq.com')  # 邮件服务器
        smtp.login(username, password)
        smtp.sendmail(sender, receiver, msg.as_string())
    smtp.quit()
    # 接收方只有一个用户时,网易、QQ都好使;接收方为多用户时,QQ好使


def main():  # 主函数
    cpu = cpu_info()
    mem = mem_info()
    disk = disk_info()
    network = network_info()
    port = port_check()
    port_result = '    ------------------------------\n    服务状态:\n'
    for each in port.items():
        port_result += f'\t{each[0]}:\t\t{each[1]}\n'
    info = port_result + f'''
    ------------------------------
    CPU使用率:\t\t{cpu}
    ------------------------------
    内存使用率:\t{mem.get('mem_per')}
    内存总容量:\t{mem.get('mem_total')}
    已使用内存:\t{mem.get('mem_used')}
    ------------------------------
    磁盘使用率:\t{disk.get('disk_per')}
    磁盘总容量:\t{disk.get('disk_total')}
    已使用磁盘:\t{disk.get('disk_used')}
    ------------------------------
    网卡发送流量:\t{network.get('network_sent')}
    网卡接收流量:\t{network.get('network_resv')}
    ------------------------------

    '''
    flag = 0
    services_msg = ''
    for i in port.items():
        if not i[1]:
            flag = 1
            services_msg += i[0] + '报错\n'
    if flag:
        info = services_msg + '\n' + info
        # 根据需求进行阈值设置
        # send_mail(info) 
    elif int(cpu[:-4]) > 80:
        info = 'CPU过载\n' + info
        # 根据需求进行阈值设置
        # send_mail(info)  
    elif int(mem.get('mem_per')[:-4]) > 80:
        info = '内存过载\n' + info
        # 根据需求进行阈值设置
        # send_mail(info)  
    print(info)


if __name__ == '__main__':
    main()



posted @ 2021-03-04 12:18  luoxian  阅读(131)  评论(0编辑  收藏  举报