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("\033[31mdisk_info:\033[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())
记录学习和生活的酸甜苦辣.....哈哈哈