import pymysql import os import re import time import datetime ''' 建表语句: CREATE TABLE `r_linux_io_monitor` ( `up_date` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '监测时间', `ip` varchar(16) DEFAULT NULL COMMENT 'IP地址', `CPU使用率` FLOAT not NULL COMMENT 'CPU使用率', `磁盘IO` text not NULL COMMENT '磁盘IO:{设备名称:{读每秒:float KB/S,写每秒:float KB/S},}', `网卡速率` text not NULL COMMENT '网卡速率:{发送速率:float bytes/s,接收速率:float bytes/s}', `内存使用率` FLOAT not NULL COMMENT '内存使用率' ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='Linux系统IO监控表'; ''' def iostat命令执行(ip:str,port:int=10022): cmd_str = "ssh -p {} {} 'sudo iostat -kx'".format(port,ip) # print(cmd_str) result=os.popen(cmd_str) result_str = result.read() return result_str; def CPU利用率计算(cmd_result_Str:str)->float: ''' 请直接将命令执行结果发送过来 总体CPU利用率 = %user + %system + %iowait ''' #avg-cpu: %user %nice %system %iowait %steal %idle avg_cpu_str = re.findall(r'(?<=\n) +.+',cmd_result_Str)[0] avg_cpu_list=re.findall(r'\d+.\d+|\d+', avg_cpu_str) CPU_usage = float(avg_cpu_list[0])+float(avg_cpu_list[2])+float(avg_cpu_list[3]) return CPU_usage; def 获取磁盘IO(cmd_result_Str:str)->dict: ''' 请直接将命令执行结果发送过来 返回的数据结构:{设备名称:{读每秒:float,写每秒:float},} ''' lines = cmd_result_Str.split('\n') idx=0 for line in lines: if('Device:' == line[:7]): break idx+=1 need_line=lines[idx+1:] ret_dict={} for line in need_line: if(0 == len(line)): #排除空字符串 continue if("dm" == line[:2]):#排除dm-开头的设备,这是虚拟设备,lvm映射出来的。 continue line = re.sub(r' +',' ',line) line_list= line.split(' ') ret_dict[line_list[0]]={'kB_read/s':line_list[1],'kB_wrtn/s':line_list[2]} return ret_dict; def 获取网卡速率(ip:str,port:int=10022)->dict: ''' 设备名称将被写死; 返回字典:{发送速率:,接收速率:},第一个是发送速率(bytes/s);第二个是接收速率(bytes/s)。 ''' 设备名称="bond0" cmd_str = "ssh -p {} {} sudo ip -s link show {}|grep -E '^ +[0-9]+' -o|grep -E [0-9]+ -o".format(port,ip,设备名称) result=os.popen(cmd_str) result_lines = result.read().split('\n') #RX在第一行,TX在第二行 #RX 表示接收(Receive)的数据量,而 TX 表示发送(Transmit)的数据量。 RX_bytes_old = int(result_lines[0]) TX_bytes_old = int(result_lines[1]) time.sleep(1) result=os.popen(cmd_str) result_lines = result.read().split('\n') #RX在第一行,TX在第二行 RX_bytes_new = int(result_lines[0]) TX_bytes_new = int(result_lines[1]) 发送速率 = TX_bytes_new-TX_bytes_old 接收速率 = RX_bytes_new-RX_bytes_old return {"发送速率":发送速率,"接收速率":接收速率}; def 获取物理内存使用率(ip:str,port:int=10022)->float: ''' ''' cmd_str = "ssh -p {} {} sudo cat /proc/meminfo".format(port,ip) result=os.popen(cmd_str) result_lines = result.read().split('\n') MemTotal=re.findall(r'\d+',result_lines[0])[0] #表示系统总内存大小,以 KB 为单位。 MemAvailable=re.findall(r'\d+',result_lines[2])[0] #表示系统当前可用的内存大小,以 KB 为单位。这个字段在最新的内核版本中提供了更准确的可用内存信息。 #不取MemFree是因为那是完完全全没有被使用的内存。 #取MemAvailable的话,是表示系统可以应急抽调的内存,它包含MemFree return round(1-(int(MemAvailable)/int(MemTotal)),2); def write_mysql(data_2List:list)->bool: mysql = pymysql.connect(host='',port=,user='',password='',database='sczxjc') # mysql = pymysql.connect(host='192.168.51.2',port=3306,user='root',password='',database='sczxjc') mysql_cursor=mysql.cursor() for data in data_2List: mysql_sql_str="INSERT INTO `sczxjc`.`r_linux_io_monitor`(`up_date`, `ip`, `CPU使用率`, `磁盘IO`, `网卡速率`, `内存使用率`) VALUES ('{}', '{}', {}, '{}', '{}', {})".format(data[0],data[1],data[2],data[3],data[4],data[5]) # print(mysql_sql_str) mysql_cursor.execute(mysql_sql_str) mysql.commit() mysql.close(); def main(): ips=["22.62.96.36","22.62.96.37","22.62.96.38","22.62.96.39","22.62.96.40","22.62.96.41","22.62.96.42","22.62.96.43","22.62.96.44","22.62.96.45","22.62.96.46","22.62.96.47","22.62.96.48","22.62.96.49","22.62.96.50","22.62.96.51","22.62.96.52","22.62.96.53","22.62.96.54",] # ips=["22.62.96.36","22.62.96.37",] now_datetime = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:00') out_result_list=[] for ip in ips: out_list=[now_datetime,ip] cmd_result_Str = iostat命令执行(ip) out_list.append(CPU利用率计算(cmd_result_Str)) out_list.append(str(获取磁盘IO(cmd_result_Str)).replace("'",'"')) out_list.append(str(获取网卡速率(ip)).replace("'",'"')) out_list.append(获取物理内存使用率(ip)) out_result_list.append(out_list) write_mysql(out_result_list); if __name__ == '__main__': main()
将数据写入mysql之后,在展示出来。
标签:监控,22.62,IO,ip,list,result,str,Linux,line From: https://www.cnblogs.com/love-DanDan/p/18191776