使用 Bash 腳本監控 Linux 服務器資源并發送告警郵件
- 前言
- 一、🛠? 腳本功能概覽
- 二、 📜 腳本核心邏輯分解
- 2.1. 變量初始化
- 2.2. CPU 使用率監控
- 2.3. 內存使用率監控
- 2.4. 磁盤使用率監控
- 2.5. 磁盤 IO 延遲監控(await)
- 2.6. 網絡流量監控
- 三、📤 告警通知機制
- 四、📁 日志文件說明
- 五、? 使用建議
- 5.1. 配置定時任務(Cron)
- 5.2. 郵件發送配置
- 5.3. 安全性建議
- 5.4. 擴展功能建議
- 六、🧩 總結
前言
??在現代 IT 運維中,及時掌握服務器的運行狀態至關重要。當 CPU、內存、磁盤、IO 或網絡等關鍵指標出現異常時,快速告警能夠幫助運維人員第一時間響應,避免服務中斷或性能下降。
??本文將介紹一個用 Bash 腳本編寫的輕量級服務器資源監控工具,它能夠實時檢測以下指標:
- CPU 使用率
- 內存使用率
- 磁盤使用率
- 磁盤 IO 延遲(await)
- 網絡流量(接收/發送速率)
當任意一項指標超過設定的閾值時,腳本將通過 郵件 發送告警信息,同時在本地日志文件中記錄狀態,便于后續排查與審計。
一、🛠? 腳本功能概覽
監控項 | 指標說明 | 閾值參數 | 告警方式 |
---|---|---|---|
CPU | CPU 使用率百分比 | CPUMAX=80% | 郵件 + 本地日志 |
內存 | 內存使用率百分比 | MEMMAX=80% | 郵件 + 本地日志 |
磁盤 | 根分區使用率百分比 | DISK_MAX=80% | 郵件 + 本地日志 |
IO(磁盤) | IO await(讀/寫) | THRES_AWAIT=50ms | 郵件 + 本地日志 |
網絡 | 接收/發送流量(MB/s) | NETWORK=10MB/s | 郵件 + 本地日志 |
二、 📜 腳本核心邏輯分解
2.1. 變量初始化
腳本開頭定義了日志路徑、郵箱配置、SMTP 信息以及各項監控閾值:
#日志
LOG_CPU="/var/log/cpu.log"
LOG_MEM="/var/log/mem.log"
LOG_DISK="/var/log/disk.log"
LOG_IO="/var/log/io_await.log"
LOG_NET="/var/log/net.log"
#郵箱
EMAIL="you_mail@.com"
SMTP_HOST="smtp.163.com"
SMTP_PORT=465
SMTP_USER="you_mail@.com"
SMTP_PASS="授權碼"
#告警閾值
CPUMAX=80
MEMMAX=80
DISK_MAX=80
THRES_AWAIT=50
NETWORK=10
📌 注意:腳本使用了
ssmtp
、sendmail
或者通過mutt
等工具結合 SMTP 服務發送。默認
2.2. CPU 使用率監控
通過 top
命令提取 CPU 空閑率,再計算使用率,并與閾值比較:
CPU=$(top -bn1|grep "Cpu(s)"|awk '{print $2}')
if (( $(echo "$CPU > $CPUMAX" | bc -l))); thenCPU_ALERT="CPU使用率: ${CPU}%(超過${CPUMAX}%)${TIME}"
elseCPU_ALERT=""echo "${TIME} :OK" >> /var/log/cpu.log
fi
2.3. 內存使用率監控
通過 free
命令獲取已用和總內存,計算使用率:
MEM_USE=$(free | awk '/Mem:/ {print $3}')
MEM_TOTAL=$(free |awk '/Mem:/ {print $2}')
MEM_USAGE=$(echo "scale=2; $MEM_USE * 100/ $MEM_TOTAL "| bc)
同樣與 MEMMAX
比較,超過則告警。
2.4. 磁盤使用率監控
使用 df -h /
獲取根分區使用百分比,去掉 %
后與 DISK_MAX
比較:
DISK_INFO=$(df -h / | grep / | awk '{print $5}'|sed 's/%//g')
2.5. 磁盤 IO 延遲監控(await)
使用 iostat -x 1 2
獲取磁盤 sda 的讀寫 await 值(第 10 和 11 列),判斷是否超過 50ms:
IO_AWAIT_R=$(iostat -x 1 2|grep sda|tail -1 |awk '{print $10}')
IO_AWAIT_W=$(iostat -x 1 2|grep sda|tail -1 |awk '{print $11}')
🧠 小知識:
await
表示每次 IO 請求的平均等待時間(單位:毫秒),數值過高可能意味著磁盤存在性能瓶頸。
2.6. 網絡流量監控
通過 /proc/net/dev
獲取指定網卡(默認第一個非 lo 網卡)的接收(RX)和發送(TX)字節數,轉換為 MB/s,與 NETWORK
閾值(10MB/s)對比:
NIC=$(ifconfig | grep -B1 "inet" | grep -v 'lo' |head -n1 |awk '{print $1}'|sed 's/://g')
RX_BYTES=$(grep "$NIC" /proc/net/dev |awk '{print $2}')
TX_BYTES=$(grep "$NIC" /proc/net/dev |awk '{print $10}')
?? 注意:該網絡監控邏輯是瞬時流量,如果要監控帶寬速率(比如每秒流量),需要兩次采樣做差值計算,這里簡化處理,僅作參考。
三、📤 告警通知機制
當任一監控項超過閾值時,腳本會:
- 拼接告警信息,包括時間與具體異常項;
- 通過
mail
命令發送郵件給指定郵箱; - 將狀態寫入對應的日志文件(如
/var/log/cpu.log
)。
示例告警郵件內容:
告警時間: 2025-09-07 20:12:36
【CPU】CPU使用率: 85.6%(超過80%)2025-09-07 20:12:36
【硬盤】硬盤使用率: 87%(超過80%)2025-09-07 20:12:36
四、📁 日志文件說明
腳本會在 /var/log/
目錄下生成如下日志,用于記錄每次檢測的結果,便于后續分析:
cpu.log
:CPU 告警或正常信息mem.log
:內存告警或正常信息disk.log
:磁盤使用率告警或正常信息io_await.log
:IO await 告警信息net.log
:網絡流量告警信息
每個日志文件在檢測正常時都會追加一行:OK
,方便做定時任務監控和統計。
五、? 使用建議
5.1. 配置定時任務(Cron)
可以將此腳本保存為 /usr/local/bin/server_monitor.sh
,然后添加到 crontab 中,例如每分鐘執行一次:
* * * * * /bin/bash /usr/local/bin/server_monitor.sh
5.2. 郵件發送配置
腳本中使用的是 mail
命令發送郵件,但要使其真正可用,通常需要:
- 安裝并配置
mailx
、mutt
或者ssmtp
- 或者使用
curl
調用第三方郵件 API(如阿里云郵件推送、SendGrid 等)
推薦使用mutt
或配置好sendmail
與 SMTP 服務對接。
5.3. 安全性建議
- 不要將郵箱密碼明文寫在腳本中,建議使用環境變量或配置文件(并限制權限)
- 腳本中涉及敏感信息(如 SMTP_PASS),建議設置文件權限為僅 root 可讀:
chmod 700 /usr/local/bin/server_monitor.sh chmod 600 /var/log/*.log
5.4. 擴展功能建議
- 增加更多網卡支持或多維度網絡流量統計
- 增加進程級別的監控(如 MySQL、Nginx 是否在運行)
- 使用更專業的監控工具集成,如 Prometheus + Grafana,但本腳本勝在輕量和易部署
六、🧩 總結
通過上述 Bash 腳本,我們可以快速搭建一套輕量級的服務器基礎資源監控和告警系統。雖然不如專業監控軟件功能全面,但對于小型環境、個人服務器或臨時監控需求,它簡單、有效、即插即用。
適用場景:
- 個人 VPS 監控
- 小公司內網服務器巡檢
- 臨時排查性能問題
- 學習 Linux 系統監控的入門實踐
技術棧:
- Bash 腳本
- Linux 命令(top, free, df, iostat, ifconfig, awk, bc)
- 郵件發送(mail / mutt / SMTP)
- Crontab 定時任務
💡 提示: 如果你首次使用 iostat
,可能需要安裝 sysstat
包:
sudo apt install sysstat # Debian / Ubuntu
sudo yum install sysstat # CentOS / RHEL