查看Linux服务器网卡流量小脚本shell和Python各一例
有时我们需要较为实时的查看服务器上的网卡流量,这里我写了两个小脚本,一个用shell(先写的,一次只能查看一个网卡),另一个用Python(后写的,一次可查看多个网卡)。脚本中都用了while true“死循环”,每隔10s从“/proc/net/dev”中取一次值并根据10s内的差值计算10s内的平均带宽;按ctrl+c停止执行。脚本兼容centos6和7 两个脚本都不太复杂,而且脚本中注释也比较细致,所以我就不过多解释脚本内容了。直接上图上脚本: shell版--使用截图: shell版代码: #!/bin/sh #byljk20160526 if["$1"=""];then#判断后面是否有跟参数 echo-e"\nuseinterface_nameafterthescript,like\"scripteth0\"...\n" exit-1 fi echo-e"\nstartmonitoringthe$1,press\"ctrl+c\"tostop" echo---------------------------------------------------------- file=/proc/net/dev#内核网卡信息文件 whiletrue 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}'` sleep10 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"%-3s%-3.1f%-10s%-4s%-3.1f%-4s\n"IN:$speed_RXMb/sOUT:$speed_TXMb/s done Python版--使用截图: Python版代码: #!/bin/envpython3 #byljk20160526 importos,re,sys,time iflen(sys.argv)==1: print('\n使用方法:请跟上网卡名称,可接"单个网卡"/"多个网卡,以空格分开".\n') sys.exit(100) else: print('startmonitoring,press"ctrl+c"tostop\n') forarginsys.argv[1:]:#输出标头 header='------{}bandwidth(Mb/s)------'.format(arg) print(header.ljust(35),end='') print() #globalvalues_dic values_dic={}#定义空字典,用来在下面函数中存放各网卡的各项需要用到的值 defget_values(orders): try: withopen('/proc/net/dev')asf: lines=f.readlines()#内容不多,一次性读取较方便 forarginsys.argv[1:]: forlineinlines: line=line.lstrip()#去掉行首的空格,以便下面split ifre.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('openfileerror') sys.exit(-1) try: whileTrue: get_values('first')#第一次取值 time.sleep(10) get_values('second')#10s后第二次取值 forarginsys.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={}#清空本次循环后字典的内容 exceptKeyboardInterrupt: print("\n-----bye-----") 这俩脚本使用起来都还是很方便实用的,共享出来希望能给朋友们工作中带来一点方便。