当前位置: 首页 > news >正文

查看Linux服务器网卡流量小脚本shell和Python各一例

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

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

shell版--使用截图:

wKiom1dGtVjC0q0TAABf9C5ErSY496.png

shell版代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/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版--使用截图:
wKiom1dGuoqS6honAAA8gQMh4e8068.png


wKioL1dGu5HDfYfbAABaNXTdogo428.png


wKioL1dGu6DRv4BPAAEkqYfpne0398.png

Python版代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#!/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-----" )

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




     本文转自kai404 51CTO博客,原文链接:http://blog.51cto.com/kaifly/1783530,如需转载请自行联系原作者



相关文章:

  • 6.4 xz压缩工具
  • Memcached通用类(基于enyim.com Memcached Client)
  • PS如何批量生成缩略图(方法可以通用其他重复劳动)
  • .NET开源项目介绍及资源推荐:数据持久层
  • Wireshark网络抓包(二)——过滤器
  • Qt之JSON生成与解析1
  • command for cut
  • ubuntu 11.10下载和编译Android源码
  • 【移动开发】Android应用开发者应该知道的东西
  • Android开发之旅:组件生命周期(二)
  • LAMP 全功能编译安装 for CentOS6.3笔记(更新)
  • springmvc的@RequestMapping、@PathVariable、@RequestParam
  • 多播、组播、广播优缺点分析
  • 向C#的String类添加按字节截取字符串的扩展方法
  • 根据要素选择集,创建新图层
  • download使用浅析
  • Fastjson的基本使用方法大全
  • Java面向对象及其三大特征
  • js 实现textarea输入字数提示
  • k8s如何管理Pod
  • MobX
  • Ruby 2.x 源代码分析:扩展 概述
  • SSH 免密登录
  • 对象管理器(defineProperty)学习笔记
  • 基于游标的分页接口实现
  • 记一次删除Git记录中的大文件的过程
  • 可能是历史上最全的CC0版权可以免费商用的图片网站
  • 扑朔迷离的属性和特性【彻底弄清】
  • 视频flv转mp4最快的几种方法(就是不用格式工厂)
  • 字符串匹配基础上
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​TypeScript都不会用,也敢说会前端?
  • ​你们这样子,耽误我的工作进度怎么办?
  • #include到底该写在哪
  • (Java)【深基9.例1】选举学生会
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .Net 应用中使用dot trace进行性能诊断
  • .Net多线程总结
  • .NET连接数据库方式
  • @configuration注解_2w字长文给你讲透了配置类为什么要添加 @Configuration注解
  • [2]十道算法题【Java实现】
  • [Android Pro] listView和GridView的item设置的高度和宽度不起作用
  • [ASP.NET MVC]Ajax与CustomErrors的尴尬
  • [C/C++] -- 二叉树
  • [CentOs7]搭建ftp服务器(2)——添加用户
  • [CF482B]Interesting Array
  • [daily][archlinux][game] 几个linux下还不错的游戏
  • [html] 动态炫彩渐变背景
  • [JS] 常用正则表达式集(一)
  • [LeetCode] 626. 换座位