前言
1. 問題背景與需求
2. Bash 腳本監控資源
3. Bash 腳本判斷閾值
4. 配置 msmtp 發送郵件
4.1 安裝 msmtp
4.2 創建配置文件 /etc/msmtprc
5. 發送郵件
5.1 給別人發郵件
6. 完整示例腳本
7. 測試方法
8. 常見問題解答
9. 總結
前言
在運維過程中,監控服務器的 CPU、內存和磁盤使用率非常重要。當資源使用率過高時,及時收到郵件告警可以避免服務中斷。本文將結合實踐,詳細講解如何用 Bash 腳本監控系統資源,并通過 msmtp 發送郵件告警。
1. 問題背景與需求
-
監控目標:
-
CPU 使用率
-
內存使用率
-
磁盤使用率
-
-
告警條件:當任意資源使用率超過閾值時發送郵件
-
郵件需求:
-
發送到指定收件人(自己或他人郵箱)
-
郵件包含主題和正文
-
郵件通過自己的 SMTP 賬戶發送(例如 QQ 郵箱)
-
2. Bash 腳本監控資源
獲取系統資源使用率的常用命令如下:
# CPU 使用率
cpu_use=$(top -bn1 | grep "Cpu(s)" | awk -F, '{print 100 - $4}' | awk -F. '{print $1}')
說明:
-
top -bn1
:以批處理模式(非交互)輸出一次 CPU 和內存狀態 -
grep "Cpu(s)"
:篩選包含 CPU 信息的行 -
awk -F, '{print 100 - $4}'
:$4
是%id
(CPU 空閑百分比),用100 - $4
計算 CPU 使用率 -
awk -F. '{print $1}'
:取整數部分,方便比較閾值
# 內存使用率
mem_use=$(free | awk '/Mem/{print $3/$2 * 100}' | awk -F. '{print $1}')
說明:
-
free
:顯示內存使用情況 -
awk '/Mem/{print $3/$2 * 100}'
:$3
是已用內存,$2
是總內存,計算百分比 -
awk -F. '{print $1}'
:取整數部分
# 根目錄磁盤使用率disk_use=$(df / | awk 'END{print $5}' | sed 's/%//')
說明:
-
df /
:查看根目錄分區使用情況 -
awk 'END{print $5}'
:取最后一行(分區行)的第五列(使用率) -
sed 's/%//'
:去掉百分號,方便比較
3. Bash 腳本判斷閾值
設置閾值,并將告警信息拼接到變量 ALERT_MSG
:
CPU_WARNING=80
MEM_WARNING=80
DISK_WARNING=80
ALERT_MSG=""
# CPU告警判斷
if [ "$cpu_use" -ge "$CPU_WARNING" ]; then
ALERT_MSG+="CPU使用率:${cpu_use}%超過閾值${CPU_WARNING}%\n"
fi
說明:
-
[ "$cpu_use" -ge "$CPU_WARNING" ]
:判斷 CPU 是否大于等于閾值 -
ALERT_MSG+=
:追加告警信息 -
\n
在echo -e
輸出時換行
? ? 類似邏輯用于內存和磁盤判斷。
4. 配置 msmtp 發送郵件
4.1 安裝 msmtp
# CentOS/RHEL
sudo yum install msmtp -y
# Ubuntu/Debian
sudo apt install msmtp -y
說明:
-
msmtp 是輕量級 SMTP 客戶端
-
支持管道輸入,將文本內容發送為郵件正文
4.2 創建配置文件 /etc/msmtprc
defaults
auth on # 開啟認證
tls on # 開啟 TLS 加密
tls_trust_file /etc/ssl/certs/ca-bundle.crt # CA 證書路徑
logfile /var/log/msmtp.log # 日志文件 account qq
host smtp.qq.com # SMTP 服務器地址
port 587 # SMTP 端口
from 3426848201@qq.com # 發件人郵箱
user 3426848201@qq.com # SMTP 用戶名
password zqhvzueytjhncjae # SMTP 授權碼 account default : qq # 默認賬戶
說明:
-
日志文件使用絕對路徑,避免
~
不被解析 -
權限必須設置為 600:
chmod 600 /etc/msmtprc
-
account default : qq
表示默認發送賬戶
5. 發送郵件
msmtp 需要在郵件內容里寫主題:
if [ -n "$ALERT_MSG" ]; then ( echo "Subject: 服務器資源告警" echo # 空行,分隔郵件頭和正文 echo -e "$ALERT_MSG" # 郵件正文 ) | msmtp "$MAIL_TO"
fi
說明:
-
if [ -n "$ALERT_MSG" ]
:僅當有告警信息時發送郵件 -
echo "Subject: ..."
:郵件主題 -
echo
:空行分隔郵件頭和正文 -
echo -e "$ALERT_MSG"
:輸出正文,支持換行
5.1 給別人發郵件
MAIL_TO="friend@example.com" ( echo "From: 3426848201@qq.com" echo "To: friend@example.com" echo "Subject: 服務器資源告警" echo echo -e "$ALERT_MSG" ) | msmtp -t
說明:
-
-t
告訴 msmtp 從郵件頭讀取收件人 -
可以一次發給多人,用逗號或空格隔開
6. 完整示例腳本
#!/bin/bash
#系統資源監控腳本#配置郵箱信息
MAIL_TO="3426848201@qq.com" #收件人郵箱#郵件標題
TITLE="服務器資源告警"#獲取CPU使用率
cpu_use=$(top -bn1 | grep "Cpu(s)" | awk -F, '{print 100 - $4}' | awk -F. '{print $1}')
#獲取磁盤使用率
disk_use=$(df / | awk 'END{print $5}' | sed 's/%//')
#獲取內存使用率
mem_use=$(free | awk '/Mem/{print $3/$2 * 100}' | awk -F. '{print $1}')#設置告警閾值
CPU_WARNING=1
MEM_WARNING=1
DISK_WARNING=1#用于保存監控信息
ALERT_MSG=""#判斷CPU
if [ "$cpu_use" -ge "$CPU_WARNING" ]; thenALERT_MSG+="CPU使用率:${cpu_use}%超過閾值${CPU_WARNING}%\n"
fi
#判斷內存
if [ "$mem_use" -ge "$MEM_WARNING" ]; thenALERT_MSG+="內存使用率:${mem_use}%超過閾值${MEM_WARNING}%\n"
fi
#判斷磁盤
if [ "$disk_use" -ge "$DISK_WARNING" ]; thenALERT_MSG+="磁盤使用率:${disk_use}%超過閾值${DISK_WARNING}%\n"
fi#如果有告警就發郵件
if [ -n "$ALERT_MSG" ]; then(echo "Subject: $TITLE"echoecho -e "$ALERT_MSG") | msmtp "$MAIL_TO"
fi
7. 測試方法
-
將閾值調低,例如
1%
,確保告警觸發 -
執行腳本:
sh Cpu內存監控.sh
-
檢查收件郵箱,確認主題和正文顯示正確
注意:可使用crontab -e
? ? ?*/5? *? *? *? *? /bin/bash? /path(腳本路徑)/shname.sh(腳本名)
實現全自動監控,如遇執行失敗,請檢查腳本是否有執行權限,沒有可用chmod提權
8. 常見問題解答
問題 | 原因 | 解決方法 |
---|---|---|
收到空郵件 | $ALERT_MSG 為空,或郵件頭和正文沒有空行 | 確保告警信息非空,郵件頭與正文間加空行 |
收到無主題郵件 | msmtp 不會自動加主題 | 在郵件內容第一行寫 Subject: |
msmtp: input error | 配置文件有語法錯誤或使用 ~ | 使用絕對路徑、保持 Unix 換行格式、權限 600 |
無法發送郵件 | SMTP 配置錯誤 | 確認 host 、port 、user 、password 正確,使用授權碼 |
9. 總結
-
Bash + msmtp 可以實現輕量級系統資源監控郵件告警
-
郵件頭、主題和正文必須正確,否則收件人可能看到空郵件或無主題
-
可以擴展支持多收件人、日志記錄和定時任務