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
英文地址,請注明出處:http://en.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;微服務之間的…