• python3 系统监控脚本(2) (监控CPU,内存等信息)


    #!/usr/bin/env python3
    #create at 2018-12-04
    'this is a system monitor scripts'
    __author__="yjt"
    
    import os
    import time
    import sys
    import datetime
    import socket  #用于获取主机名
    import psutil  #用于获取CPU等信息
    import re
    
    #以下是变量值,自己定义
    CPUT = 2      #计算CPU利用率的时间间隔
    NETT = 2      #计算网卡流量的时间间隔
    LOOPT = 2     #脚本循环时间间隔
    
    #获取系统基本信息
    def baseinfo():
        hostname = socket.gethostname()
        user_conn = len(psutil.users())
        start_time = datetime.datetime.fromtimestamp(psutil.boot_time()).strftime("%Y-%m-%d %H:%M:%S")
        now_time = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
    #    sys_runtime = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time() - psutil.boot_time()))
        sys_runtime = os.popen('w').readline().split('users')[0].split('up')[1].strip()[:-1].strip()[:-1]
        process = os.popen('ps -ef |wc -l').read().split()[0]
        return {"hostname":hostname,"user_conn":user_conn,"sys_start_time":start_time,"now_time":now_time,"sys_runtime":sys_runtime,"process":process}
    print('')
    print(baseinfo())
    #获取CPU信息
    def cpuinfo():
        ave_load = os.popen('uptime').readline().split(":")[-1].split()
        ave_load = ' '.join(ave_load) #CPU平均负载
        #以下四项值都是获取的瞬时值
        user_time = psutil.cpu_times().user  #用户态使用CPU时间
        sys_time = psutil.cpu_times().system #系统态使用CPU时间
        idle_time = psutil.cpu_times().idle #CPU空闲时间
        iowait_time = psutil.cpu_times().iowait #IO等待时间
        total_cpu = 0
        for i in range(len(psutil.cpu_times())):
            total_cpu += psutil.cpu_times()[i]  
        user_use = str(round(user_time / total_cpu * 100,2)) + '%'
        sys_use = str(round(sys_time / total_cpu * 100,2)) + '%'
        idle = str(round(idle_time / total_cpu * 100,2)) + '%'
        iowait = str(round(iowait_time / total_cpu * 100,2)) + '%'
        cpu_pre = str(psutil.cpu_percent(CPUT)) + "%"
        logical_cpu = psutil.cpu_count()
        pyhsical_cpu = psutil.cpu_count(logical=False)
        #获取CPU使用最高的前十行
        top10 = len(os.popen('ps aux|grep -v PID|sort -rn -k +3|head -10').readlines())
    #    dic1 = {"ave_load":ave_load,"user_use":user_use,"sys_use":sys_use,"idle":idle,"iowait":iowait,"cpu_pre":cpu_pre,"logical_cpu":logical_cpu,"pyhsical_cpu":pyhsical_cpu}
        l1,l2,l3,l4,l5,l6 = [],[],[],[],[],[]
        for i in range(10):
            #user = os.popen('ps aux|grep -v PID|sort -rn -k +4|head').readlines().[info].split()[0]
            pid = int(os.popen('ps aux|grep -v PID|sort -rn -k +3|head -10').readlines()[i].split()[1])
            info = psutil.Process(pid)
            user = info.username()
            process_name = info.exe()
            cpu_use = str(info.cpu_percent()) + '%'
            status = info.status()
            l1.append(user)
            l2.append(pid)
            l3.append(cpu_use)
            l4.append(process_name)
            l5.append(status)
    
    #def cpu():
    #以下获取的是逻辑CPU的瞬时值
        with open('/proc/stat','r') as f:
            cpu_item = f.readlines()
        for i in cpu_item:
            if re.search("^cpu[0-9]{1,}",i):
                cpu_info = i
                cpu_info = cpu_info.split(' ')
                cpu_number = cpu_info[0]
                cpu_total = 0
                for num in cpu_info:
                    if num.isdigit():
                        cpu_total += float(num)
                    cpu_free = float(cpu_info[4])
                cpu_use = str(round((1 - cpu_free / cpu_total) * 100 ,2)) + '%'
    #            print(cpu_number,cpu_use)
    
    
    
        return {
                 "ave_load":ave_load,
                 "user_use":user_use,
                 "sys_use":sys_use,
                 "idle":idle,
                 "iowait":iowait,
                 "cpu_pre":cpu_pre,
                 "logical_cpu":logical_cpu,
                 "pyhsical_cpu":pyhsical_cpu,
                 "logical_cpu_use":[{"cpu_number":cpu_number},{"cpu_use":cpu_use}],
                 "cpu_top10":[
                              ({"user":l1[0]},{"pid":l2[0]},{"cpu_use":l3[0]},{"process_name":l4[0]},{"status":l5[0]}),
                              ({"user":l1[1]},{"pid":l2[1]},{"cpu_use":l3[1]},{"process_name":l4[1]},{"status":l5[1]}),
                              ({"user":l1[2]},{"pid":l2[2]},{"cpu_use":l3[2]},{"process_name":l4[2]},{"status":l5[2]}),
                              ({"user":l1[3]},{"pid":l2[3]},{"cpu_use":l3[3]},{"process_name":l4[3]},{"status":l5[3]}),
                              ({"user":l1[4]},{"pid":l2[4]},{"cpu_use":l3[4]},{"process_name":l4[4]},{"status":l5[4]}),
                              ({"user":l1[1]},{"pid":l2[5]},{"cpu_use":l3[5]},{"process_name":l4[5]},{"status":l5[5]}),
                              ({"user":l1[5]},{"pid":l2[6]},{"cpu_use":l3[6]},{"process_name":l4[6]},{"status":l5[6]}),
                              ({"user":l1[7]},{"pid":l2[7]},{"cpu_use":l3[7]},{"process_name":l4[7]},{"status":l5[7]}),
                              ({"user":l1[8]},{"pid":l2[8]},{"cpu_use":l3[8]},{"process_name":l4[8]},{"status":l5[8]}),
                              ({"user":l1[9]},{"pid":l2[9]},{"cpu_use":l3[9]},{"process_name":l4[9]},{"status":l5[9]})
                             ]
               }
    print('')
    print(cpuinfo())
    #获取内存信息
    def meminfo():
        total_mem = str(round(psutil.virtual_memory().total / 1024 /1024/1024)) + 'G'
        use_mem = str(round(psutil.virtual_memory().used / 1024 /1024/1024)) + 'G'
        mem_percent = str(psutil.virtual_memory().percent) + '%'
        free_mem = str(round(psutil.virtual_memory().free / 1024 /1024/1024)) + 'G'
        swap_mem = str(round(psutil.swap_memory().total / 1024 /1024/1024)) + "G"
        swap_use = str(round(psutil.swap_memory().used / 1024 /1024/1024 )) + 'G'
        swap_free = str(round(psutil.swap_memory().free / 1024 /1024/1024))  + 'G'
        swap_percent = str(psutil.swap_memory().percent) + '%'
     #获取memory使用最高的前十行
        top10 = len(os.popen('ps aux|grep -v PID|sort -rn -k +4|head -10').readlines())
    #    dic1 = {"ave_load":ave_load,"user_use":user_use,"sys_use":sys_use,"idle":idle,"iowait":iowait,"cpu_pre":cpu_pre,"logical_cpu":logical_cpu,"pyhsical_cpu":pyhsical_cpu}
        l1,l2,l3,l4,l5,l6 = [],[],[],[],[],[]
        for i in range(10):
            #user = os.popen('ps aux|grep -v PID|sort -rn -k +4|head').readlines().[info].split()[0]
            pid = int(os.popen('ps aux|grep -v PID|sort -rn -k +4|head -10').readlines()[i].split()[1])
            info = psutil.Process(pid)
            user = info.username()
            process_name = info.exe()
            mem_use = str(round(info.memory_percent(),2)) + '%'
            status = info.status()
            l1.append(user)
            l2.append(pid)
            l3.append(mem_use)
            l4.append(process_name)
            l5.append(status)
        return {
                 "total_mem":total_mem,
                 "use_mem":use_mem,
                 "free_mem":free_mem,
                 "mem_percent":mem_percent,
                 "swap_mem":swap_mem,
                 "swap_use":swap_use,
                 "swap_free":swap_free,
                 "swap_percent":swap_percent,
                 "mem_top10":[
                              ({"user":l1[0]},{"pid":l2[0]},{"mem_use":l3[0]},{"process_name":l4[0]},{"status":l5[0]}),
                              ({"user":l1[1]},{"pid":l2[1]},{"mem_use":l3[1]},{"process_name":l4[1]},{"status":l5[1]}),
                              ({"user":l1[2]},{"pid":l2[2]},{"mem_use":l3[2]},{"process_name":l4[2]},{"status":l5[2]}),
                              ({"user":l1[3]},{"pid":l2[3]},{"mem_use":l3[3]},{"process_name":l4[3]},{"status":l5[3]}),
                              ({"user":l1[4]},{"pid":l2[4]},{"mem_use":l3[4]},{"process_name":l4[4]},{"status":l5[4]}),
                              ({"user":l1[1]},{"pid":l2[5]},{"mem_use":l3[5]},{"process_name":l4[5]},{"status":l5[5]}),
                              ({"user":l1[5]},{"pid":l2[6]},{"mem_use":l3[6]},{"process_name":l4[6]},{"status":l5[6]}),
                              ({"user":l1[7]},{"pid":l2[7]},{"mem_use":l3[7]},{"process_name":l4[7]},{"status":l5[7]}),
                              ({"user":l1[8]},{"pid":l2[8]},{"mem_use":l3[8]},{"process_name":l4[8]},{"status":l5[8]}),
                              ({"user":l1[9]},{"pid":l2[9]},{"mem_use":l3[9]},{"process_name":l4[9]},{"status":l5[9]})
                             ]
               }
    print('')
    print(meminfo())
    #获取磁盘信息
    def diskinfo():
        #print("33[31mdisk_info:33[0m")
        #print("disk%-10s total%-10s free%-10s used%-10s percent%-10s"%('','(G)','(G)','(G)','(%)'))
        d1,d2,d3,d4,d5 = [],[],[],[],[]
        disk_total,disk_used,disk_free = 0,0,0
        disk_len = len(psutil.disk_partitions())
        for info in range(disk_len):
            disk = psutil.disk_partitions()[info][1]
            if len(disk) < 10:
                d1.append(disk)
                total = str(round(psutil.disk_usage(disk).total /1024/1024/1024)) + 'G'
                total_num = psutil.disk_usage(disk).total
                disk_total  += total_num
                free = str(round(psutil.disk_usage(disk).free /1024/1024/1024)) + 'G'
                disk_free += psutil.disk_usage(disk).free
                used = str(round(psutil.disk_usage(disk).used /1024/1024/1024)) + 'G'
                disk_used += psutil.disk_usage(disk).used
                percent = str(psutil.disk_usage(disk).percent) + '%'
                d2.append(total)
                d3.append(free)
                d4.append(used)
                d5.append(percent)
        disk_used_percent = str(round(disk_used / disk_total * 100,2)) + '%'
        disk_free_percent = str(round(disk_free / disk_total * 100,2)) + '%'
        disk_total = str(round(disk_total /1024/1024/1024)) + "G"
        disk_free = str(round(disk_free /1024/1024/1024)) + "G"
        disk_used = str(round(disk_used /1024/1024/1024)) + "G"
        return {
                "disk":[
                         {"disk_total":disk_total},
                         {"disk_free":disk_free},
                         {"disk_used":disk_used},
                         {"disk_used_percent":disk_used_percent},
                         {"disk_free_percent":disk_free_percent}
                       ],
                "partitions": [
                                {"mount":(d1)},
                                {"total":(d2)},
                                {"free":(d3)},
                                {"used":(d4)},
                                {"percent":(d5)}
                              ]
              }
    print('')
    print(diskinfo())
    #diskinfo()
    
    
    #获取网卡信息
    def netinfo():
        net_item = list(psutil.net_if_addrs())
        for net in net_item:
            if re.search(r'bond.*|em.*|eno.*|^eth.*',net):
                network_card = net
                ip = psutil.net_if_addrs()[net][0].address
                recv_1,recv_2,send_1,send_2=0,0,0,0
                with open ('/proc/net/dev','r') as f:
                    net_info = f.readlines()
                    net_list = str(net_info).lower().split()
                    if net_list[0] == net:
                        recv_1 = float(net_list[1])
                        send_1 = float(net_list[9])
                time.sleep(NETT)
                with open ('/proc/net/dev','r') as f:
                    net_info = f.readlines()
                    net_list = str(net_info).lower().split()
                    if net_list[0] == net:
                        recv_2 = float(net_list[1])
                        send_2 = float(net_list[9])
                    received = str(recv_2/1024 - recv_1/1024) + "kb/s"
                    transmit = str(send_2/1024 - send_1/1024) + "kb/s"
        return {
               "network":[
                           {"network_card":network_card},
                           {"ip":ip},
                           {"transmit":transmit},
                           {"received":received}
                         ]
               }
    print('')
    print(netinfo())
    #获取TCP连接数
    def tcpinfo():
        status_list = ["LISTEN","ESTABLISHED","TIME_WAIT","CLOSE_WAIT","LAST_ACK","SYN_SENT"]
        status_init = []
        net_conn =  psutil.net_connections()
        n1 = []
        for key in net_conn:
            status_init.append(key.status)
        for value in status_list:
            num = status_init.count(value)
            n1.append(num)
        return {
                "LISTEN":n1[0],
                "ESTABLISHED":n1[1],
                "TIME_WAIT":n1[2],
                "CLOSE_WAIT":n1[3],
                "LAST_ACK":n1[4],
                "SYN_SENT":n1[5]
               }
    print('')
    print(tcpinfo())
    

      

  • 相关阅读:
    [改善Java代码]养成良好习惯,显式声明UID
    [改善Java代码]警惕自增的陷阱
    [改善Java代码]覆写变长方法也循规蹈矩
    [改善Java代码]别让null值和空值威胁到变长方法
    [改善Java代码]避免带有变长参数的方法重载
    [改善Java代码]三元操作符的类型务必一致
    关于Windows下mysql忘记root密码的解决方法
    关于同步VSS服务器上的代码发生Eclipse里面的项目全部不见了
    关于关闭Eclipse的控制台自动跳出
    关于Windows下如何查看端口占用和杀掉进程
  • 原文地址:https://www.cnblogs.com/yjt1993/p/10065417.html
Copyright © 2020-2023  润新知