有時我們需要較爲實時的查看服務器上的網卡流量,這裏我寫了兩個小腳本,一個用shell(先寫的,一次只能查看一個網卡),另一個用Python(後寫的,一次可查看多個網卡)。腳本中都用了while true“死循環”,每隔10s從“/proc/net/dev”中取一次值並根據10s內的差值計算10s內的平均帶寬;按ctrl+c停止執行。腳本兼容centos6和7
兩個腳本都不太複雜,而且腳本中註釋也比較細緻,所以我就不過多解釋腳本內容了。直接上圖上腳本:
shell版–使用截圖:
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版–使用截圖:
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-----")
這倆腳本使用起來都還是很方便實用的,共享出來希望能給朋友們工作中帶來一點方便。