linux调用iperf3测试服务器之间的传输速度,并发送邮件

前言: 测试环境ubuntu18.04 在两台服务器之间安装iperf3 apt install iperf3 -y 放脚本的服务器上必须安装了python3,且安装了paramiko模块 apt install python -y apt install python3-pip -y pip3 install paramiko #代码: import smtplib,paramiko,os,sys from email.header import Header from email.mime.application import MIMEApplication from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText hostname = "10.10.30.49" # 服务器的ip port = 33001 # 服务器的端口 username = "root" # 服务器的用户名 password = "%79@b!aqeTDtx" # 用户名对应的密码 # smtp服务器信息 smtp_server = 'mail.southbaytech.co' server_port = 25 # 发送方信息 sender = 'cherry_xu@southbaytech.co' mail_password = 'xxxxxx' # 收件人地址,列表可发给多人 receivers = ['cherry_xu@southbaytech.co'] if(os.system('ping -c 2 -W 1 %s' %hostname)==0): #ssh远程登录目标服务器 ssh = paramiko.SSHClient() policy = paramiko.AutoAddPolicy() ssh.set_missing_host_key_policy(policy) ssh.connect( hostname, #服务器的ip port, #服务器的端口 username, #服务器的用户名 password #用户名对应的密码 ) stdin,stdout,stderr = ssh.exec_command('iperf3 -s -i 2',get_pty=True) stdin.close() os.system('iperf3 -c %s -u -i 2 -b 200M | tee /tmp/result.txt' %hostname) file=open('/tmp/result.txt','r') text=file.readlines() file.close() # 实例化,先添加正文内容 msg = MIMEMultipart() msg.attach(MIMEText('服务器之间的速度测试', 'plain', 'utf-8')) # 添加附件1 att1 = MIMEApplication(open('/tmp/result.txt', 'rb').read(), 'utf-8') att1['Content-Disposition'] = 'attachment; filename="result.txt"' # filename随便起,是接收到的附件显示名称 # att1["Content-Type"] = 'application/octet-stream' Content-Type默认为application/octet-stream msg.attach(att1) # 邮件头信息 msg['From'] = Header(sender) # 发件人 msg['To'] = Header(', '.join(receivers)) # 发到哪里,参数为字符串 msg['Subject'] = Header(text[1]) # 邮件标题 # 发送邮件的操作 server=smtplib.SMTP(smtp_server,server_port) try: server.starttls() server.login(sender, mail_password) # 登录发信邮箱 server.sendmail(sender, receivers, msg.as_string()) # 发送邮件 print('邮件发送成功') except smtplib.SMTPException: print('邮件发送失败') ssh.close() else: ping_result = os.popen('ping -c 2 -W 1 %s' % hostname).read() # 实例化,先添加正文内容 msg = MIMEMultipart() msg.attach(MIMEText(ping_result, 'plain', 'utf-8')) # 邮件头信息 msg['From'] = Header(sender) # 发件人 msg['To'] = Header(', '.join(receivers)) # 发到哪里,参数为字符串 msg['Subject'] = Header('与目标服务器链接失败') # 邮件标题 # 发送邮件的操作 server=smtplib.SMTP(smtp_server,server_port) try: server.starttls() server.login(sender, mail_password) # 登录发信邮箱 server.sendmail(sender, receivers, msg.as_string()) # 发送邮件 print('邮件发送成功') except smtplib.SMTPException: print('邮件发送失败') #静默执行脚本 ...

2023年1月13日 · 2 分钟 · 269 字 · AIHugoBlog

python写的服务器性能监控脚本

代码示例 # -*- coding: UTF-8 -*- #!/usr/bin/env python import time,math,socket,struct import MySQLdb,psutil ###### 内存信息 ####### def getMemoryState(): phymem = psutil.virtual_memory() total = long(phymem.total) used = long(phymem.used) # percent = phymem.percent # mem_str = "Total:"+ str(total/1024/1024) + "MB;Used:" + str(used/1024/1024) +"MB;Percent:" + str(percent) +"%" mem_list =[total/1024/1024,used/1024/1024] return mem_list ###### CPU信息 ####### def getCpuState(interval=1): cpu_util = psutil.cpu_percent(interval) return int(cpu_util) ###### 硬盘信息 ####### def getDiskState(): disk_total = 0 disk_used = 0 disk_free = 0 disk_list = psutil.disk_partitions() # disk_info_list = [] # 硬盘所有信息包含挂载点 for disk_part in disk_list: disk_sub_total = long(math.ceil(psutil.disk_usage(disk_part.mountpoint).total)) # 获取分区总容量 disk_sub_used = long(math.ceil(psutil.disk_usage(disk_part.mountpoint).used)) # 获取分区已使用 disk_sub_free = long(math.ceil(psutil.disk_usage(disk_part.mountpoint).free)) # 获取分区剩余 disk_sub_percent = str((math.ceil(psutil.disk_usage(disk_part.mountpoint).percent))) disk_sub_info = "point:" + disk_part.mountpoint + ";total:"+ str(disk_sub_total/1024/1024/1024) + "GB;used:" + str(disk_sub_used/1024/1024/1024) + "GB;free:" + str(disk_sub_free/1024/1024/1024) + "GB;percent:" + disk_sub_percent + "%" disk_total = disk_total + disk_sub_total disk_used = disk_used + disk_sub_used disk_free = disk_free + disk_sub_free # disk_info_list.append(disk_sub_info) # disk_percent = str(round(float(disk_used)/float(disk_total)*100,2)) # disk_info = "Total:" + str(disk_total/1024/1024/1024) + "GB;Used:" + str(disk_used/1024/1024/1024) + "GB;Free:" + str(disk_free/1024/1024/1024) + "GB;Percent:" + disk_percent + "%" # disk_info_list.append(disk_info) disk_info = [disk_total/1024/1024/1024,disk_used/1024/1024/1024] return disk_info ###### 网络信息 ####### def getNetState(): key_info, net_in, net_out = getNetDate(get_key) net_list = [] received = 0 send = 0 for key in key_info: i = unicode(key, errors='ignore') if i !="lo" and ("Loopback" not in i): # j = i + ";received:" + str(net_in.get(key)) + "MB;send:" + str(net_out.get(key)) + "MB" # net_str = net_str + " " + j received = received + net_in.get(key) send = send + net_out.get(key) net_list.append(received) net_list.append(send) return net_list def getNetDate(func): key_info, old_recv, old_sent = func() # 上一秒收集的数据 time.sleep(1) key_info, now_recv, now_sent = func() # 当前所收集的数据 net_in = {} net_out = {} for key in key_info: net_in.setdefault(key, (now_recv.get(key) - old_recv.get(key)) / 1024 /1024) # 每秒接收速率 net_out.setdefault(key, (now_sent.get(key) - old_sent.get(key)) / 1024 /1024) # 每秒发送速率 return key_info, net_in, net_out def get_key(): # 获取网卡名称、收发字节 key_info = psutil.net_io_counters(pernic=True).keys() # 获取网卡名称 recv = {} sent = {} for key in key_info: recv.setdefault(key, psutil.net_io_counters(pernic=True).get(key).bytes_recv) # 各网卡接收的字节数 sent.setdefault(key, psutil.net_io_counters(pernic=True).get(key).bytes_sent) # 各网卡发送的字节数 return key_info, recv, sent ###### 获取主机名和IP地址 ####### def get_ip_host(): lis = [] hostname = socket.gethostname() # ip = socket.gethostbyname(hostname) lis.append(hostname) # lis.append(ip) info = psutil.net_if_addrs() for k,v in info.items(): for item in v: if item[0] == 2 and not item[1] == '127.0.0.1': lis.append(item[1]) return lis ###### 执行数据库操作 ####### def mysql_sh(ip_host,machine_info): ### 数据初始化 ip = socket.ntohl(struct.unpack("I", socket.inet_aton(str(ip_host[1])))[0]) # if ip_host[2]: # print("second ip is %s"% ip_host[2]) sql_search = "select * from machine where ip='" + str(ip) + "'" machine_info_search = "select id from machine where ip='" + str(ip) + "'" # 打开数据库连接 db = MySQLdb.connect("itopdb.southbaytech.co", "itop", "itop", "itop",3304,charset='utf8') # 使用cursor()方法获取操作游标 cursor = db.cursor() # 查询插入machine_info cursor.execute(sql_search) results = cursor.fetchall() if results: cursor.execute(machine_info_search) server_search = cursor.fetchall() for j in server_search: machine_id = j[0] # 设定machine_info插入 disk_total = machine_info['disk_state'][0] disk_used = machine_info['disk_state'][1] mem_total = machine_info['mem_state'][0] mem_used = machine_info['mem_state'][1] net_received = machine_info['net_state'][0] net_send = machine_info['net_state'][1] create_time = int(time.time()) machine_info_insert = 'insert into machine_info(machine_id,cpu_state,disk_total,disk_used,mem_total,mem_used,create_time,net_received,net_send) \ values (%d,%f,%d,%d,%d,%d,%d,%d,%d)' % \ (machine_id ,machine_info['cpu_state'],disk_total,disk_used,mem_total,mem_used,create_time,net_received,net_send) # 执行server_info插入 try: cursor.execute(machine_info_insert) db.commit() except: db.rollback() else: print("machine is not exist!") # 关闭数据库连接 db.close() ###### 主程序 ####### if __name__=='__main__': while 1 : try: machine_info = {} machine_info["cpu_state"] = getCpuState() machine_info["disk_state"] = getDiskState() machine_info["mem_state"] = getMemoryState() machine_info["net_state"] = getNetState() ip_host = get_ip_host() # 获取主机名和IP地址 mysql_sh(ip_host,machine_info) # 数据库插入更新 time.sleep(3) except KeyboardInterrupt: exit()

2023年1月13日 · 3 分钟 · 527 字 · AIHugoBlog

python安装whl包时出现的问题解决is not a supported wheel on this platform

1.问题 psutil-5.7.0-cp38-cp38-win_amd64.whl is not a supported wheel on this platform. 2.查找问题 # 进入python,输入以下代码,查看pip支持的类型 import pip._internal print(pip._internal.pep425tags.get_supported()) # 结果: [('cp38', 'cp38m', 'win32'), ('cp38', 'none', 'win32'), ('py3', 'none', 'win32'), ('cp38', 'none', 'any'), ('cp3', 'none', 'any'), ('py38', 'none', 'any'), ('py3', 'none', 'any'), ('py37', 'none', 'any'), ('py36', 'none', 'any'), ('py35', 'none', 'any'), ('py34', 'non e', 'any'), ('py33', 'none', 'any'), ('py32', 'none', 'any'), ('py31', 'none', 'any'), ('py30', 'none', 'any')] 3.解决 修改whl包名为支持的类型,如: psutil-5.7.0-cp38-none-any.whl 4.再次安装 (venv) D:\project_python\it>pip install psutil-5.7.0-cp38-none-any.whl Processing d:\project_python\it\psutil-5.7.0-cp38-none-any.whl Installing collected packages: psutil Successfully installed psutil-5.7.0

2023年1月12日 · 1 分钟 · 81 字 · AIHugoBlog

python--requirements.txt的创建及使用

python项目中必须包含一个 requirements.txt 文件,用于记录所有依赖包及其精确的版本号。以便新环境部署。 1.在虚拟环境中使用pip生成: pip freeze >requirements.txt 安装或升级包后,最好更新这个文件。 2.当需要创建这个虚拟环境的完全副本,可以创建一个新的虚拟环境,并在其上运行以下命令: pip install -r requirements.txt

2023年1月12日 · 1 分钟 · 13 字 · AIHugoBlog