很多时候,我们是需要查看服务器的网卡当前跑了多大流量,但对于网卡流量的查询,在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-08-01 18:18:18
""" import psutil
import time
from datetime import datetime
import curses
import argparse def 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, sent def 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, networkOut def 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 = 1
for interface in interfaces:
if interface != "lo" and bool(1 - interface.startswith("veth")) and bool(
1 - interface.startswith("br")) and bool(
1 - interface.startswith("蓝牙")) and bool(1 - interface.startswith("VMware")):
if unit == "K" or unit == "k":
netIn = "%12.2fKB/s" % 0
netOut = "%11.2fKB/s" % 0
elif unit == "M" or unit == "m":
netIn = "%12.2fMB/s" % 0
netOut = "%11.2fMB/s" % 0
elif unit == "G" or unit == "g":
netIn = "%12.3fGB/s" % 0
netOut = "%11.3fGB/s" % 0
else:
netIn = "%12.1fB/s" % 0
netOut = "%11.1fB/s" % 0
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 += 4
stdscr.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 = 1
for interface in interfaces:
if interface != "lo" and bool(1 - interface.startswith("veth")) and bool(
1 - interface.startswith("br")) 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 += 4
stdscr.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.time
unit = args.unit
output(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实现实时监控网卡流量的更多相关文章

  1. shell脚本 awk实现实时监控网卡流量

    一.简介 通过第3方工具获得网卡流量,这个大家一定很清楚.其实通过脚本一样可以实现效果.下面是我个人工作中整理的数据.以下是shell脚本统计网卡流量. 现原理: cat /proc/net/dev ...

  2. linux shell awk实现实时监控网卡流量脚本

    goodtools! 原文 awk 'BEGIN{ OFMT="%.3f"; devf="/proc/net/dev"; while(("cat &q ...

  3. Linux下监控网卡流量的软件Nload

    Linux下监控网卡流量的软件Nload 安装nload: # wget http://www.roland-riegel.de/nload/nload-0.7.2.tar.gz # tar zxvf ...

  4. 在RedHa上安装MRTG监控网卡流量

    http://os.51cto.com/art/201103/252149.htm 2011-03-30 15:05 张微波 phpchina 字号:T | T 在RedHa上安装MRTG监控网卡流量 ...

  5. zabbix3.4 监控网卡流量设置差量

    自定义监控项的时候 看里面预设的监控网卡下载流量的key是 net.if.in[if,<mode>]这次可以监控流量了 但是添加监控项的时候 看网上别人的 都是可以设置数值是每秒的差量 出 ...

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

    官网上说使用iftop需要libpcap和libcurses这两个包. 用命令查找了一下 #  rpm -qa | grep libpcap libpcap-0.9.4-15.el5 只找到了这个,缺 ...

  7. 监控网卡流量脚本(Python)

    #!/usr/bin/env python# coding: utf-8# author: Xiao Guaishou try:    import psutilexcept ImportError: ...

  8. CactiEZ安装与配置-监控网卡流量

    1.1. 环境 本例CactiEZ-10.1-x86_64.iso下载地址 https://pan.baidu.com/s/1vivDJqpgtoBXRLm2D-bBTQ 密码:u12l 测试环境 服 ...

  9. CentOS6.4 配置Nload监控网卡流量

    1.安装依赖包 yum install -y gcc gcc-c++ ncurses-devel make wget 2.下载Nload wget http://www.roland-riegel.d ...

随机推荐

  1. MySQL 删除表中所有数据

    方法一:使用 delete from [表名]    生成日志 方法二:使用 truncate table [表名]    无日志生成 两种方式删除后再插入数据,第一条id的值不一样 方法一: 方法二 ...

  2. pandas之groupby分组与pivot_table透视

    一.groupby 类似excel的数据透视表,一般是按照行进行分组,使用方法如下. df.groupby(by=None, axis=0, level=None, as_index=True, so ...

  3. Nginx配置各种响应头防止XSS,点击劫持,frame恶意攻击

    为什么要配置HTTP响应头? 不知道各位有没有被各类XSS攻击.点击劫持 (ClickJacking. frame 恶意引用等等方式骚扰过,百度联盟被封就有这些攻击的功劳在里面.为此一直都在搜寻相关防 ...

  4. Java-每日学习笔记(数据库与idea技巧)

    Java杂记-2020.07.28 简单记录下今天项目用到的东西还有技术公众号学到的一些知识点 Java事务 idea编码技巧 数据库快速插入100万条数据 Java实现sql回滚 Java事务 事务 ...

  5. Python无限循环

    Python 无限循环:在 while 循环语句中,可以通过让判断条件一直达不到 False ,实现无限循环. 条件表达式: # var = 1 # while var == 1: # 表达式永远为 ...

  6. luogu P3829 [SHOI2012]信用卡凸包 凸包 点的旋转

    LINK:信用卡凸包 当 R==0的时候显然是一个点的旋转 之后再求凸包即可. 这里先说点如何旋转 如果是根据原点旋转的话 经过一个繁杂的推导可以得到一个矩阵. [cosw,-sinw] [sinw, ...

  7. Spring Boot必备技能之Starter自定义

    本文摘自于<Spring Cloud微服务 入门 实战与进阶>一书.  作者:尹吉欢 Spring Boot的方便体现在简化了很多繁琐的配置,对开发人员来说是一个福音,通过引入各种Spri ...

  8. Idea风格的快捷键

    在使用IntelliJ IDEA时,是可以定义快捷键风格的:File --> Setting --> Keymap 里进行选择,因为我以前用Eclipse开发,后来换成Idea有2年的时间 ...

  9. 动态生成HTML元素-模拟在线考试功能

    前言 我们在项目开发过程中,经常会遇到页面html元素无法提前预设,而是通过某一些条件动态生成的情况,这里我们需要考虑如下几个因素: 1.需要动态创建的元素类型,比如TextBox, Radio, C ...

  10. 基于asp.net core 从零搭建自己的业务框架(二)

    前言 对于项目的迭代,如何降低复杂性的要求高于性能以及技术细节的 一个易用的项目,才能迭代到比拼性能,最后拼刺刀的阶段 传统单体项目,都是传统三层,直接请求响应的模式,这类称为Rpc模式,易用性上非常 ...