本文介绍下,在linux下监控网卡流量的一个shell脚本,通过读取/proc/net/dev/中的数据,对网卡流量加以分析。有需要的朋友参考下。

在linux中,可以使用命令 cat /proc/net/dev 获取网卡的当前信息。

该命令详细列出当前网卡流入流出的字节总数,要监控网络的流量。


我们要做的,就是按一定的时间间隔去读取流量信息,然后进行四则运算,得出想要的结果即可。


代码如下:


——————————————————————————————————

#!/bin/bash


usage() {

        echo "Useage : $0"

        echo "eg. sh $0 eth0 2"

        exit 1

}


if [ $# -lt 2 ]

then

        usage

fi


eth=$1

timer=$2


in_old=$(cat /proc/net/dev | grep $eth | sed -e "s/\(.*\)\:\(.*\)/\2/g" | awk '{print $1 }')

out_old=$(cat /proc/net/dev | grep $eth | sed -e "s/\(.*\)\:\(.*\)/\2/g" | awk '{print $9 }')


while true

do

        sleep ${timer}

        in=$(cat /proc/net/dev | grep $eth | sed -e "s/\(.*\)\:\(.*\)/\2/g" | awk '{print $1 }')

        out=$(cat /proc/net/dev | grep $eth | sed -e "s/\(.*\)\:\(.*\)/\2/g" | awk '{print $9 }')

        dif_in=$(((in-in_old)/timer))

        dif_in=$((dif_in/1024))

        dif_out=$(((out-out_old)/timer))

        dif_out=$((dif_out/1024))

        ct=$(date +"%F %H:%M:%S")

        echo "${ct} -- IN: ${dif_in} KByte/s     OUT: ${dif_out} KByte/s"

        in_old=${in}

        out_old=${out}

done


exit 0

___________________________________________________________________________________

使用方法:

sh erikxue_net.sh bond0 2 #表示每两秒钟监控bond0这个网卡的流量。



代码说明:

1,此代码接收两个参数,参数1为要监测的网卡接口,比如eth0;参数2为监测的间隔时间,比如可以设为2秒监测一次。

2,此脚本使用了sed、awk命令,不了解的朋友,建议好好掌握下,这二个命令在linux中那是相当值得深究的。


下面是该脚本在笔者电脑上的运行结果,自用的内网机器没啥流量,作个参考演示吧。

如下图:
wKioL1SJTmCQzaaJAAcJq_iMMC8331.jpg

有关/proc/net/dev/中参数的说明,参考如下:

wKiom1SJTozzZAZMAANKkhXw5_U954.jpg

参数说明:

1,最左边的表示接口的名字,Receive表示收包,Transmit表示收包;

2,bytes表示收发的字节数;

3,packets表示收发正确的包量;

4,errs表示收发错误的包量;

5,drop表示收发丢弃的包量;