有时候要实时查询网络服务器上的网卡总流量。这里我写了两个小脚本,一个用shell(先写的,一次只能查询一个网卡),另一个用Python(后来写的,一次可以查询几个网卡)。而真正的“无限循环”在所有脚本中使用,每隔10s从“/proc/net/dev”中取值,根据10s内的误差计算10s内的平均网络带宽;按ctrl+c终止实现。脚本与centos6和7兼容
两个剧本都不算太复杂,剧本里的注释比较细腻,所以我要过多的表达剧本的内容。脚本立即出现在图中:
shell版本-应用程序的屏幕截图:
外壳版本代码:
#!/bin/sh #by ljk 20160526 if [ "$1" = "" ];then #分辨后边是不是有跟主要参数 echo -e "\n use interface_name after the script,like "script eth0"...\n" exit -1 fi echo -e "\n start monitoring the $1,press "ctrlc" to stop" echo ---------------------------------------------------------- file=/proc/net/dev #核心网卡信息内容文档 while true do RX_bytes=`cat $file|grep $1|sed 's/^ *//g'|awk -F'[ :]' '{print $2}'` #这儿sed这一步为了更好地另外兼容centos6和7 TX_bytes=`cat $file|grep $1|sed 's/^ *//g'|awk -F'[ :]' '{print $10}'` sleep 10 RX_bytes_later=`cat $file|grep $1|sed 's/^ *//g'|awk -F'[ :]' '{print $2}'` TX_bytes_later=`cat $file|grep $1|sed 's/^ *//g'|awk -F'[ :]' '{print $10}'` #B*8/1024/1024=Mb speed_RX=`echo "scale=2;($RX_bytes_later - $RX_bytes)*8/1024/1024/10"|bc` speed_TX=`echo "scale=2;($TX_bytes_later - $TX_bytes)*8/1024/1024/10"|bc` printf "%-三秒 %-3.1f %-10s %-4s %-3.1f %-4s\n" IN: $speed_RX Mb/s OUT: $speed_TX Mb/s donePython版本-应用程序截图:
Python版本代码:
#!/bin/env python3 #by ljk 20160526 import os,re,sys,time if len(sys.argv) == 1: print('\n *** 作方法:请紧跟网卡名字,可配"单独网卡"/"好几个网卡,以空格分离".\n') sys.exit(100) else: print('start monitoring,press "ctrlc" to stop\n') for arg in sys.argv[1:]: #輸出标题文字 header = '------{} bandwidth(Mb/s)------'.format(arg) print(header.ljust(35),end='') print() #global values_dic values_dic = {} #界定空字典,用于在下面涵数中储放各网卡的各类必须采用的值 def get_values(orders): try: with open('/proc/net/dev') as f: lines=f.readlines() #內容很少,一次性载入较便捷 for arg in sys.argv[1:]: for line in lines: line=line.lstrip() #除掉行首的空格,便于下边split if re.match(arg,line): values = re.split("[ :]",line) #以空格和:做为分节符 values_dic[arg'r'orders]=values[1] #1为接受值 values_dic[arg't'orders]=values[9] #9为推送值 #return [values[1],values[9]] #可返回列表 except (FileExistsError,FileNotFoundError,PermissionError): print('open file error') sys.exit(-1) try: while True: get_values('first') #第一次赋值 time.sleep(10) get_values('second') #10s后第二次赋值 for arg in sys.argv[1:]: r_bandwidth = (int(values_dic[arg'r''second']) - int(values_dic[arg'r''first']))/1024/1024/10*8 t_bandwidth = (int(values_dic[arg't''second']) - int(values_dic[arg't''first']))/1024/1024/10*8 print('IN: 'str(round(r_bandwidth,2)).ljust(8)' OUT: 'str(round(t_bandwidth,2)).ljust(16),end='') print() values_dic = {} #清除此次循环系统后字典的內容 except KeyboardInterrupt: print("\n-----bye-----")这两个脚本都非常方便易用。资源共享有望给朋友带来一点便利。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)