很多时候,我们是需要查看服务器的网卡当前跑了多大流量,但对于网卡流量的查询,在linux下似乎没有像top那样的原生命令。虽然top功能很强大,可以实时查看cpu、内存、进程的动态,但是却没有对网卡流量的监控。既然没有,那那就自己写一个吧,哈哈。本文代码综合使用了psutil和curses模块,脚本工具同时支持在linux和windows下使用,支持动态查看网卡流量。当然现在也有些第三方的工具可以使用,比如iftop。

1.psutil模块

psutil可以获取系统的很多信息,包括CPU,内存,磁盘,网络,并且还可以查看系统进程等信息。psutil是一个跨平台的库,支持linux、windows、freebsd、OSX等多个操作系统平台。

2.curses模块

curses库提供一个独立于终端的屏幕显示,支持各种控制代码来执行常见的操作,如移动光标、滚动屏幕和擦除区域。curses库将终端屏幕看成是由字符单元组成的坐标系,每一个单元由行坐标和列坐标来标示。坐标原点是屏幕的左上角,行坐标自上而下递增,列坐标自左而右递增。

3.实现思路

利用psutil获取到网卡的上传下载流量,计算出当前网卡的流量速率。然后利用curses将流量数据动态的输出到终端,实现top命令类似的动态刷新效果。

4.代码实现

# -*- coding:utf-8 -*-"""
@Author: Rainbowhhy
@Date: 2020-12-04 10:00:00
"""import psutil
import time
from datetime import datetime
import curses
import argparsedef getNetworkData():# 获取网卡流量信息recv = {}sent = {}data = psutil.net_io_counters(pernic=True)interfaces = data.keys()for interface in interfaces:recv.setdefault(interface, data.get(interface).bytes_recv)sent.setdefault(interface, data.get(interface).bytes_sent)return interfaces, recv, sentdef getNetworkRate(num):# 计算网卡流量速率interfaces, oldRecv, oldSent = getNetworkData()time.sleep(num)interfaces, newRecv, newSent = getNetworkData()networkIn = {}networkOut = {}for interface in interfaces:networkIn.setdefault(interface, float("%.3f" % ((newRecv.get(interface) - oldRecv.get(interface)) / num)))networkOut.setdefault(interface, float("%.3f" % ((newSent.get(interface) - oldSent.get(interface)) / num)))return interfaces, networkIn, networkOutdef output(num, unit):# 将监控输出到终端stdscr = curses.initscr()curses.start_color()# curses.init_pair(1, curses.COLOR_RED, curses.COLOR_WHITE)curses.noecho()curses.cbreak()stdscr.clear()try:# 第一次初始化interfaces, _, _ = getNetworkData()currTime = datetime.now()timeStr = datetime.strftime(currTime, "%Y-%m-%d %H:%M:%S")stdscr.addstr(0, 0, timeStr)i = 1for interface in interfaces:if interface != "lo" and bool(1 - interface.startswith("veth")) and bool(1 - interface.startswith("蓝牙")) and bool(1 - interface.startswith("VMware")):if unit == "K" or unit == "k":netIn = "%12.2fKB/s" % 0netOut = "%11.2fKB/s" % 0elif unit == "M" or unit == "m":netIn = "%12.2fMB/s" % 0netOut = "%11.2fMB/s" % 0elif unit == "G" or unit == "g":netIn = "%12.3fGB/s" % 0netOut = "%11.3fGB/s" % 0else:netIn = "%12.1fB/s" % 0netOut = "%11.1fB/s" % 0stdscr.addstr(i, 0, interface)stdscr.addstr(i + 1, 0, "Input:%s" % netIn)stdscr.addstr(i + 2, 0, "Output:%s" % netOut)stdscr.move(i + 3, 0)i += 4stdscr.refresh()# 第二次开始循环监控网卡流量while True:_, networkIn, networkOut = getNetworkRate(num)currTime = datetime.now()timeStr = datetime.strftime(currTime, "%Y-%m-%d %H:%M:%S")stdscr.erase()stdscr.addstr(0, 0, timeStr)i = 1for interface in interfaces:if interface != "lo" and bool(1 - interface.startswith("veth")) and bool(1 - interface.startswith("蓝牙")) and bool(1 - interface.startswith("VMware")):if unit == "K" or unit == "k":netIn = "%12.2fKB/s" % (networkIn.get(interface) / 1024)netOut = "%11.2fKB/s" % (networkOut.get(interface) / 1024)elif unit == "M" or unit == "m":netIn = "%12.2fMB/s" % (networkIn.get(interface) / 1024 / 1024)netOut = "%11.2fMB/s" % (networkOut.get(interface) / 1024 / 1024)elif unit == "G" or unit == "g":netIn = "%12.3fGB/s" % (networkIn.get(interface) / 1024 / 1024 / 1024)netOut = "%11.3fGB/s" % (networkOut.get(interface) / 1024 / 1024 / 1024)else:netIn = "%12.1fB/s" % networkIn.get(interface)netOut = "%11.1fB/s" % networkOut.get(interface)stdscr.addstr(i, 0, interface)stdscr.addstr(i + 1, 0, "Input:%s" % netIn)stdscr.addstr(i + 2, 0, "Output:%s" % netOut)stdscr.move(i + 3, 0)i += 4stdscr.refresh()except KeyboardInterrupt:# 还原终端curses.echo()curses.nocbreak()curses.endwin()except Exception as e:curses.echo()curses.nocbreak()curses.endwin()print("ERROR: %s!" % e)print("Please increase the terminal size!")finally:curses.echo()curses.nocbreak()curses.endwin()if __name__ == "__main__":parser = argparse.ArgumentParser(description="A command for monitoring the traffic of network interface! Ctrl + C: exit")parser.add_argument("-t", "--time", type=int, help="the interval time for ouput", default=1)parser.add_argument("-u", "--unit", type=str, choices=["b", "B", "k", "K", "m", "M", "g", "G"],help="the unit for ouput", default="B")parser.add_argument("-v", "--version", help="output version information and exit", action="store_true")args = parser.parse_args()if args.version:print("v1.0")exit(0)num = args.timeunit = args.unitoutput(num, unit)

5.用法说明

1.仅支持python3。
2.需安装psutil库,windows需安装curses库,linux默认自带,如果没有也需安装。
3.支持指定刷新时间间隔,-t或者–time。
4.支持指定流量输出单位,-u或者–unit。
5.使用示例:
(1)每5秒刷新一次数据,流量单位为M/s
python3 network.py -t 5 -u M或者python3 network.py -t 5 -u m
(2)默认不指定参数,表示每一秒刷新一次数据,流量单位为B/s
python3 network.py

6.实现效果

linux下的效果

windows下的效果

号外

可以使用工具将脚本打包成二进制文件,之后可以像执行linux命令那样直接执行,无需安装依赖包。
networkstat下载
目前支持Ubuntu14.04以上,CentOS7以上,Debian8以上,Windows10,Windows2008R2以上。

用python实现实时监控网卡流量(类似 top 动态刷新)相关推荐

  1. shell awk实现实时监控网卡流量脚本(常见应用二)

    通过第3方工具获得网卡流量,这个大家一定很清楚.其实通过脚本一样可以实现效果.下面是我个人工作中整理的数据.以下是shell脚本统计网卡流量. 实现原理: [chengmo@localhost ~]$ ...

  2. 详解实时查看网卡流量的几款工具

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取推荐书籍 来源:dazhuanlan.com nload工具 nload用于 ...

  3. linux 下iptraf监控网卡流量

    linux 系统下 iptraf监控网卡流量,监控eth0网卡的流量如下所示: [root@web01]# iptraf -d eth0      转载于:https://blog.51cto.com ...

  4. 在 Linux/UNIX 终端下使用 nload 实时监控网络流量和带宽使用

    摘要:如果你想在命令行界面监控网络吞吐量,nload应用程序是个不错的选择.它是一个实时监控网络流量和带宽使用的控制台应用程序,使用两个图表可视化地展示接收和发送的流量,并提供诸如数据交换总量.最小/ ...

  5. Linux日常运维管理技巧(一)监控系统状态、监控网卡流量、监控IO性能、查看系统进程、查看网络状态、Linux下抓包tcpdump、Linux网络相关、DNS配置

    目录 监控系统状态 监控网卡流量 监控IO性能 查看系统进程 查看网络状态 Linux下抓包 Linux网络相关 监控系统状态 w/uptime查看系统负载 [root@zyshanlinux-01 ...

  6. linux 下三款监控网卡流量的软件iptraf iftop nload

    linux 下监控网卡流量的软件  1.iftop 官方说需要libpcap 和libcurses 两个包----(libcurses包不安装也可以)  系统需要 libpcap  和libpcap- ...

  7. Linux下监控网卡流量的软件iftop

    系统:centos 5.5 官网上说使用iftop需要libpcap和libcurses这两个包. 用命令查找了一下 #  rpm -qa | grep libpcap libpcap-0.9.4-1 ...

  8. linux清理网卡流量,Linux实时显示网卡流量的工具nload

    个人觉得nload是个很好用的一个工具,功能也很强.只是相对单一,只能查看总的流量,不能像iptraf那样,可针对IP,协议等,可以实时地监控网卡的流量,分Incoming,Outgoing两部分,也 ...

  9. 遇到问题之-cacti监控网卡流量traffic

    Cacti 是一套基于PHP.MySQL.SNMP和RRDTool开发的网络流量监测图形分析工具. 若希望使用 Cacti 监控 Linux 服务器的网卡流量,需要在被监控的 Linux 服务器上安装 ...

最新文章

  1. 解释型语言与编译型的必须知识点
  2. 访问SharePoint站点时,提示:Service Unavailable
  3. 第七届杭州云栖大会召开 阿里云在人工智能领域发力
  4. 《阿里巴巴 Java 开发手册》读书笔记
  5. 收藏:asp.net
  6. fl如何保存再次打开_「Excel技巧」Excel2016如何将自己设计的图表存为模板反复使用?...
  7. 玩玩机器学习4——TensorFlow基础之激活函数
  8. vi/vim使用进阶: 文件浏览和缓冲区浏览
  9. java局部变量的描述正确的是_【Java入门课|这才是Java局部变量的正确使用方法,你真的会用这些吗】- 环球网校...
  10. C# 联合查询_c# 之linq——小白入门级
  11. 如何学习ReactJS:初学者完整指南
  12. 并注册烧写钩子 获取启动介质类型_PyTorch中对张量登记注册反向传播的钩子函数,并展示调用顺序...
  13. 负载均衡之让nginx跑起来
  14. C/C++代码虚拟化保护 在移动端的应用
  15. virtualbox中给CentOS根分区扩容的方法
  16. linux下intel安装教程,在64位Ubuntu下安装Intel Fortran 11
  17. Mac 修改hosts文件
  18. 加权平均数的例子_加权平均值和算术平均值的区别与公式
  19. Android 7.0 Settings Summary 小记
  20. Ubuntu20.04微信安装 简单 使用方便

热门文章

  1. 张程伟:从开源项目到企业级数据库,云和恩墨 MogDB Uqbar 的技术探索与实践...
  2. 分布式架构演进,浅析前世与今生
  3. Java 如何复制 List ?
  4. 关于HTC刷机和刷回官方系统出现image update FAil提示
  5. LIMS系统在实验室规范运作中的应用价值
  6. 七种遍历HashMap的方法
  7. 【原创】ESP32+NTC热敏电阻测温SD卡采集OLED显示,Begabung_TC250
  8. JDBC 来操作数据库(转尚硅谷java 练习)
  9. 备考英语六级刷题记录2
  10. 毕业,精彩三年:走吧,我的朋友们。离别难,万里征,车船明日是故乡