频道栏目
首页 > 网络 > 其他 > 正文
查看Linux服务器网卡流量小脚本shell和Python各一例
2016-05-30 09:17:12           
收藏   我要投稿

有时我们需要较为实时的查看服务器上的网卡流量,这里我写了两个小脚本,一个用shell(先写的,一次只能查看一个网卡),另一个用Python(后写的,一次可查看多个网卡)。脚本中都用了while true“死循环”,每隔10s从“/proc/net/dev”中取一次值并根据10s内的差值计算10s内的平均带宽;按ctrl+c停止执行。脚本兼容centos6和7

两个脚本都不太复杂,而且脚本中注释也比较细致,所以我就不过多解释脚本内容了。直接上图上脚本:

shell版--使用截图:

wKiom1dGtVjC0q0TAABf9C5ErSY496.png

shell版代码:

#!/bin/sh
#byljk20160526

if["$1"=""];then#判断后面是否有跟参数
echo-e"\nuseinterface_nameafterthescript,like\"scripteth0\"...\n"
exit-1
fi

echo-e"\nstartmonitoringthe$1,press\"ctrl+c\"tostop"
echo----------------------------------------------------------

file=/proc/net/dev#内核网卡信息文件
whiletrue
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}'`
sleep10
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_RXMb/sOUT:$speed_TXMb/s
done

Python版--使用截图:wKiom1dGuoqS6honAAA8gQMh4e8068.png

 

wKioL1dGu5HDfYfbAABaNXTdogo428.png

 

wKioL1dGu6DRv4BPAAEkqYfpne0398.png

Python版代码:

#!/bin/envpython3
#byljk20160526

importos,re,sys,time

iflen(sys.argv)==1:
print('\n使用方法:请跟上网卡名称,可接"单个网卡"/"多个网卡,以空格分开".\n')
sys.exit(100)
else:
print('startmonitoring,press"ctrl+c"tostop\n')

forarginsys.argv[1:]:#输出标头
header='------{}bandwidth(Mb/s)------'.format(arg)
print(header.ljust(35),end='')
print()

#globalvalues_dic
values_dic={}#定义空字典,用来在下面函数中存放各网卡的各项需要用到的值

defget_values(orders):
try:
withopen('/proc/net/dev')asf:
lines=f.readlines()#内容不多,一次性读取较方便
forarginsys.argv[1:]:
forlineinlines:
line=line.lstrip()#去掉行首的空格,以便下面split
ifre.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('openfileerror')
sys.exit(-1)

try:
whileTrue:
get_values('first')#第一次取值
time.sleep(10)
get_values('second')#10s后第二次取值

forarginsys.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={}#清空本次循环后字典的内容
exceptKeyboardInterrupt:
print("\n-----bye-----")

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

点击复制链接 与好友分享!回本站首页
上一篇:zabbix通过微信企业号发送图文消息
下一篇:haproxy+keepalived实现高可用负载均衡
相关文章
图文推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站