有时我们需要较为实时的查看服务器上的网卡流量,这里我写了两个小脚本,一个用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-----")

这俩脚本使用起来都还是很方便实用的,共享出来希望能给朋友们工作中带来一点方便。

更多相关文章

  1. Scientific Linux:我需要获取一个shell脚本变量并使用它来搜索awk
  2. 【Linux_Shell 脚本编程学习笔记五、Oracle JDK1.8 安装shell 脚
  3. linux网卡实现高可用:team链路聚合
  4. 我已提取并尝试使用启动脚本(./start navicat)来启动 Navicat Linu
  5. linux 判定那块网卡为eth0
  6. 多队列网卡CPU中断均衡
  7. 在Linux中的脚本中安装应用程序
  8. Linux基础之无线网卡配置连接测试相关操作
  9. 如何为UDP组播设置一个套接字,并提供两个网卡?

随机推荐

  1. API 23 widget.Space——属性分析
  2. 在android创建bitmap避免低记忆法
  3. Android日志框架SLF4J Android
  4. android configuration example
  5. android全屏,强制竖屏,强制横屏
  6. Android相关网站
  7. Android 一些小技巧
  8. Listview中item与button类控件获取焦点问
  9. android答题系统(三):答题部分的实现
  10. 【Android】输入设备配置文件(.idc文件)