查看Linux服務器網卡流量小腳本shell和Python各一例

有時我們需要較爲實時的查看服務器上的網卡流量,這裏我寫了兩個小腳本,一個用shell(先寫的,一次只能查看一個網卡),另一個用Python(後寫的,一次可查看多個網卡)。腳本中都用了while true“死循環”,每隔10s從“/proc/net/dev”中取一次值並根據10s內的差值計算10s內的平均帶寬;按ctrl+c停止執行。腳本兼容centos6和7

兩個腳本都不太複雜,而且腳本中註釋也比較細緻,所以我就不過多解釋腳本內容了。直接上圖上腳本:

shell版–使用截圖:
image
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 \"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/s
done

Python版–使用截圖:
image

image

image

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-----") 

這倆腳本使用起來都還是很方便實用的,共享出來希望能給朋友們工作中帶來一點方便。

發佈了50 篇原創文章 · 獲贊 33 · 訪問量 18萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章