有時我們需要較為實時的查看服務器上的網卡流量,這里我寫了兩個小腳本,一個用shell(先寫的,一次只能查看一個網卡),另一個用Python(后寫的,一次可查看多個網卡)。
腳本中都用了while true“死循環”,每隔10s從“/proc/net/dev”中取一次值并根據10s內的差值計算10s內的平均帶寬;按ctrl+c停止執行。腳本兼容centos6和7
兩個腳本都不太復雜,而且腳本中注釋也比較細致,所以我就不過多解釋腳本內容了。
直接上圖上腳本:
shell版–使用截圖:
shell版代碼:
#!/bin/sh#by ljk 20160526if [ "$1" = "" ];then #判斷后面是否有跟參數 echo -e "/n use interface_name after the script,like /"script eth0/".../n" exit -1fiecho -e "/n start monitoring the $1,press /"ctrl+c/" 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 "%-3s %-3.1f %-10s %-4s %-3.1f %-4s/n" IN: $speed_RX Mb/s OUT: $speed_TX Mb/sdone
Python版–使用截圖:
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 "ctrl+c" 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-----")
這倆腳本使用起來都還是很方便實用的,共享出來希望能給朋友們工作中帶來一點方便。
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。
新聞熱點
疑難解答