Linux 网络流量监控 Shell 脚本详解(支持邮件告警)

前言

一、脚本功能

二、实现原理

三、Shell 脚本实现

四、关键知识点解析

1. Bash 关联数组

2. 命令组 { } 与子 Shell ( )

3. 字符串拼接换行

4. 流量计算逻辑

五、测试方法

六、优化建议

七、总结

前言

在生产环境中,监控服务器的 网络流量 非常重要,尤其是下载/上传流量突然激增时,需要及时告警。本文将介绍如何使用 Shell 脚本 + msmtp 实现网络流量监控和邮件告警,并解析其中的关键知识点。


一、脚本功能

  • 监控指定网卡的下载(RX)和上传(TX)流量

  • 当流量超过阈值(MB)时触发邮件告警

  • 支持多网卡监控

  • 可生成日志,记录每次流量情况


二、实现原理

  1. 采集网卡流量

Linux 系统中,每个网卡的流量信息在:

/sys/class/net/<网卡名称>/statistics/rx_bytes # 下载字节数 
/sys/class/net/<网卡名称>/statistics/tx_bytes # 上传字节数

这些值是 累计字节数

  1. 计算流量

公式:

实际流量 = 第二次采样值 - 第一次采样值
  • RX = 下载流量(字节)

  • TX = 上传流量(字节)

  • 转换为 MB:RX_MB = RX / 1024 / 1024

  1. 告警触发

  • 当 RX_MB 或 TX_MB ≥ 阈值时,拼接告警信息

  • 通过 msmtp 发送邮件

  1. 日志记录

  • 每次采样后的流量记录到日志文件

  • 告警信息也记录到日志


三、Shell 脚本实现

#!/bin/bash#要监控的网卡列表
NET_LIST=("eth0")
#设置阈值(MB)
NET_WARNING=0
#采集时间
TIME=5
#设置日志文件位置
LOG_FILE="/var/log/net_warning.log"
#设置收件人
MAIL_TO="3426848201@qq.com,2270993679@qq.com"
#设置标题
TITLE="网络流量告警"
#设置发送邮件函数
send_file(){local msg="$1"{echo "Subject: $TITLE"echo "To: $MAIL_TO"echoecho -e "$msg"} | msmtp -t
}
#设置日志函数
log(){local msg="$1"echo -e "$(date +"%F %T") $msg" >> "$LOG_FILE"
}
#设置关联数组用于保存采集数据
#关联数组可以使用字符串作为索引
declare -A RX_BYTES_1
declare -A TX_BYTES_1
declare -A RX_BYTES_2
declare -A TX_BYTES_2
#进行第一次采集
for IF in "${NET_LIST[@]}"; doRX_BYTES_1[$IF]=$(cat /sys/class/net/$IF/statistics/rx_bytes)TX_BYTES_1[$IF]=$(cat /sys/class/net/$IF/statistics/tx_bytes)
done
#等待60秒再进行采集,确保数据合理稳定
sleep $TIME
#进行第二次采集
for IF in "${NET_LIST[@]}"; doRX_BYTES_2[$IF]=$(cat /sys/class/net/$IF/statistics/rx_bytes)TX_BYTES_2[$IF]=$(cat /sys/class/net/$IF/statistics/tx_bytes)
done
#设置空变量用于保存告警信息
ALERT_MSG=""
#进行流量计算,判断阈值
#计算公式为
#实际下载流量 = 第二次采样下载字节数 - 第一次采样下载字节数
#实际上传流量 = 第二次采样上传字节数 - 第一次采样上传字节数
#1MB = 1024x1024字节,RX/TX计算的默认为字节数,所以需要/1024/1024换算成MB
for IF in "${NET_LIST[@]}"; doRX=$((RX_BYTES_2[$IF] - RX_BYTES_1[$IF]))TX=$((TX_BYTES_2[$IF] - TX_BYTES_1[$IF]))RX_MB=$((RX / 1024 / 1024))TX_MB=$((TX / 1024 / 1024))log "接口 $IF: 下载${RX_MB}MB, 上传${TX_MB}MB"if [ $RX_MB -ge $NET_WARNING ]; thenALERT_MSG+="接口 $IF 下载流量超限: ${RX_MB}MB"$'\n'fi if [ $TX_MB -ge $NET_WARNING ]; thenALERT_MSG+="接口 $IF 上传流量超限: ${TX_MB}MB"$'\n'fi 
done
#发送邮件进行告警
if [ -n "$ALERT_MSG" ]; then#调用log和send_file函数将告警信息传递给$1,通过send_file函数发送邮件log "触发告警:\n$ALERT_MSG"send_file "$ALERT_MSG"
fi

四、关键知识点解析

1. Bash 关联数组

declare -A RX_BYTES_1
  • 可以用 字符串索引(网卡名)保存数据

  • 示例:

RX_BYTES_1["eth0"]=123456

2. 命令组 { } 与子 Shell ( )

{ echo "Subject: $TITLE" 
echo "To: $MAIL_TO" 
echo 
echo -e "$msg" } | msmtp -t
  • { ... }当前 shell 执行,不创建子 shell

  • (...) 会在 子 shell 执行,变量修改不会影响外部

3. 字符串拼接换行

ALERT_MSG+="接口 $IF 下载流量超限: ${RX_MB}MB"$'\n'
  • $'\n' 生成实际换行字符

  • echo -e "$ALERT_MSG" 可正确显示换行

4. 流量计算逻辑

RX=$((RX_BYTES_2[$IF] - RX_BYTES_1[$IF])) 
TX=$((TX_BYTES_2[$IF] - TX_BYTES_1[$IF]))
  • 计算两次采样的差值

  • 单位是字节(Bytes),转换 MB 后用于判断阈值


五、测试方法

为了测试脚本功能,可以 临时降低阈值和缩短采样间隔

NET_WARNING=1 # 阈值 1MB,方便触发 
TIME=5 # 采样间隔 5 秒
  1. 执行脚本:

sh NetWork上传下载监控.sh
  1. 生成日志:

cat /var/log/net_warning.log
  1. 检查邮件是否收到

  2. 可以用下载或上传测试流量:

wget http://speedtest.tele2.net/10MB.zip -O /dev/null 
curl -T localfile 
ftp://ftpserver/ --user user:pass
  1. 测试完成后,恢复正式阈值和采样间隔


六、优化建议

  • 日志按天生成,避免过大

  • 支持多个收件人

  • 可通过命令行参数调整网卡列表和阈值

  • 可通过 cron 定时执行,实现 持续监控


七、总结

  • 利用 /sys/class/net/.../statistics/ 获取网卡累计流量

  • 关联数组保存采样数据,计算两次差值得到实际流量

  • $'\n' 拼接告警信息,并通过 msmtp 发送邮件

  • 日志记录每次采样及告警信息

  • 可以通过调整阈值和采样间隔快速测试脚本

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/95963.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95963.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【牛客刷题-剑指Offer】BM18 二维数组中的查找:一题四解,从暴力到最优

文章目录 一、题目介绍 1.1 描述 1.2 示例1 1.3 示例2 1.4 给的部分代码 二、题解 方法一:暴力遍历 方法二:二分查找(逐行) 方法三:Z字形查找(最优解) 方法四:递归分治(拓展思路) 三、总结 心得体会 一、题目介绍 原题链接:https://www.nowcoder.com/practice/abc3…

使用pyspark对上百亿行的hive表生成稀疏向量

背景&#xff1a;一张上百亿行的hive表&#xff0c;只有id和app两列&#xff0c;其中app的去重量是8w多个&#xff08;原app有上百万枚举值&#xff0c;此处已经用id数量进行过筛选&#xff0c;只留下有一定规模的app&#xff09;&#xff0c;id的去重量大概有八九亿&#xff0…

【设计模式】关于学习《重学Java设计模式》的一些成长笔记

【设计模式】关于学习《重学Java设计模式》的一些成长笔记 没有几个人是一说就会的,掌握一些技能,不仅要用心,而且还需要从温故中知新。 为此,好记性不如烂笔头,我干脆一步一脚印地系统学习一遍设计模式! (关注不迷路哈!!!) 文章目录 【设计模式】关于学习《重学Jav…

【基础-判断】@Entry装饰的自定义组件将作为页面的入口。在单个页面中可以使用多个@Entry装饰不同自定义组件。

@Entry装饰的自定义组件将作为页面的入口。在单个页面中可以使用多个@Entry装饰不同自定义组件。 解释: @Entry 的核心作用与唯一性:@Entry 装饰器用于明确声明该组件是一个页面的入口组件,即整个页面的“根”和“起点”。当UIAbility实例加载并显示页面时,系统需要明确知道…

医学影像AI应用-实践:使用MONAI实现肺部CT图像分割的原理与实践

🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C++, C#,Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C++、C#等开发语言,熟悉Java常用开发技术,能熟练应用常用数据库SQL server,Oracle,mysql,postgresql等进行开发应用…

如何训练一个简单的Transformer模型(附源码)李宏毅2025大模型-作业4

摘要&#xff1a;一、作业目标&#xff1a;使用只有2层transformer的GPT-2&#xff0c;生成完整宝可梦图像。二、源码&解析&#xff1a;使用提供的Transformer模型&#xff08;GPT-2&#xff09;进行训练&#xff0c;FID Score: 96.3425一、作业目标1&#xff09;目标使用T…

leetcode211.添加与搜索单词-数据结构设计

与208.前缀树的设计是一样的&#xff0c;关键点在于word中存在通配符“."&#xff0c;所以针对该特殊情况&#xff0c;在search时针对这里进行全子节点的深度搜索class WordDictionary {TrieNode root;private class TrieNode {char val;// 当前节点的值&#xff0c;冗余了…

项目中的一些比较实用的自定义控件

本文是记录项目开发中一些相对复杂但都比较实用的控件&#xff0c;这些控件都是基于自定义的方式去实现&#xff0c;如果有需要的朋友&#xff0c;这个可以作为一个参考&#xff0c;同时也做一个自我总结。 &#xff08;1&#xff09;子项大小不一致的RecyclerView&#xff08;…

[iOS] 折叠 cell

目录 前言 1.原理 2.折叠 cell 的点击选中 3.折叠 cell 高度的变化 4.实现效果 5.总结 前言 折叠 cell 是在 3GShare 中写过的一个小控件&#xff0c;这篇博客是一个小小的总结。 1.原理 在这里的核心就是我们可以通过改变按钮的 tag 值来判断我们是否应该展开还是回收…

MySQL的组复制(MGR)高可用集群搭建

一、MySQL 组复制&#xff08;MGR&#xff09;核心概念 MySQL Group Replication&#xff08;简称 MGR&#xff09;是 MySQL 官方推出的 高可用&#xff08;HA&#xff09; 强一致性 解决方案&#xff0c;基于改进的 Paxos 协议实现&#xff0c;核心能力可概括为 3 点&#xf…

使用Shell脚本实现Linux系统资源监控邮件告警

前言 1. 问题背景与需求 2. Bash 脚本监控资源 3. Bash 脚本判断阈值 4. 配置 msmtp 发送邮件 4.1 安装 msmtp 4.2 创建配置文件 /etc/msmtprc 5. 发送邮件 5.1 给别人发邮件 6. 完整示例脚本 7. 测试方法 8. 常见问题解答 9. 总结 前言 在运维过程中&#xff0c…

设计整体 的 序分(三“释”)、正宗分(双“门”)和流通分(统一的通行表达式) 之3 “自明性”(腾讯元宝 之2)

Q&AQ11、可能还需要补充 魂轴、体轴 和 中心轴 并行 上升 的内容Q11.1、我刚才说“可能还需要补充 魂轴、体轴 和 中心轴 并行 上升 的内容” 是指的 我们今天前面讨论 得出的整体设计 的一个概念整体 的一个双螺旋上升结构中的三个轴。 您刚才是这样 理解的吗&#xff1f;…

使用Ansible自动化部署Hadoop集群(含源码)--环境准备

现在我们有5台虚拟机&#xff0c;已经配置好了主机名和网络我们的目标是通过Ansible实现自动化部署hadoop集群。在此之前&#xff0c;我们先编写一个shell脚本来配置hadoop集群的环境&#xff0c;包括安装软件、安装配置Ansible&#xff08;一个主节点四个工作节点&#xff09;…

C#海康车牌识别实战指南带源码

C#海康车牌识别实战指南带源码前言车牌识别技术在智能交通、停车场管理等领域有着广泛的应用。海康威视作为国内领先的安防厂商&#xff0c;其车牌识别相机提供了丰富的SDK接口供开发者使用。本文将详细介绍如何使用C#语言结合海康威视SDK实现车牌识别功能&#xff0c;并解析关…

智慧能源新范式:数字孪生平台如何驱动风电场的精细化管理?

摘要你有没有想过&#xff0c;一座风力发电场背后&#xff0c;藏着一个“看不见的孪生兄弟”&#xff1f;它能提前预知风机故障&#xff0c;实时模拟极端天气的影响&#xff0c;甚至能“训练”运维人员在虚拟场景中演练抢修。这就是数字孪生——一个让风电场从“靠经验管理”转…

STM32-FreeRTOS操作系统-任务管理

引言 随着嵌入式技术的飞速发展&#xff0c;STM32与FreeRTOS的融合愈发紧密。本文聚焦于STM32平台下FreeRTOS操作系统的任务管理&#xff0c;旨在为开发者提供清晰的思路与实用的技巧&#xff0c;助力高效开发。 为什么要进行任务管理&#xff1f; 在嵌入式系统中&#xff0c;…

工业领域 ACP 协议全解析:从入门到实战案例

工业领域 ACP 协议全解析&#xff1a;从入门到实战案例 文章目录工业领域 ACP 协议全解析&#xff1a;从入门到实战案例一、前言二、ACP 协议是什么&#xff1f;1. 基本定义2. 与数据传输协议的区别三、ACP 协议的核心功能1. 身份认证&#xff08;Authentication&#xff09;2.…

计算机组成原理:计算机硬件的基本组成

&#x1f4cc;目录&#x1f5a5;️ 计算机硬件的基本组成&#xff1a;从经典到现代的架构演进&#x1f9e9; 一、计算机硬件的五大部分&#xff1a;功能与协同&#x1f4e5; &#xff08;一&#xff09;输入设备&#xff1a;人机交互的“入口”&#x1f4e4; &#xff08;二&am…

AI歌手功能终于上线!Suno AI 带你保存歌曲的灵魂

当我们谈论一首歌时&#xff0c;究竟是什么让它“独一无二”&#xff1f;是主唱的声音质感&#xff1f;是旋律里的氛围&#xff1f;还是那种无法复制的风格气息&#xff1f; 如今&#xff0c;Suno AI 给出了答案—— AI歌手功能正式上线&#xff01; &#x1f31f;什么是「AI…

Dubbo3.3 Triple协议处理东西向流量

前言 Apache Dubbo 3.3 对 Triple 协议做了升级&#xff0c;现在 Dubbo 不仅可以处理东西向流量&#xff0c;也可以处理南北向流量。 **东西向流量&#xff08;East-West Traffic&#xff09; ** 指数据中心或网络内部同级设备/服务之间的通信。例如&#xff0c;微服务之间的…