1、監控系統中的cpu、內存、硬盤、、使用率超過80%進行郵件告警(可使用郵箱QQ)
詳細步驟說明:
1.?腳本初始化
#!/bin/bash
:指定使用bash shell執行dateMax=80
:設置資源使用率閾值(80%)
2.?資源監控
CPU使用率:
top -bn1 | grep "Cpu" | awk '{print 100 - $8}'
top -bn1
:獲取一次系統狀態grep "Cpu"
:過濾CPU信息awk '{print 100 - $8}'
:計算CPU使用率(100% - 空閑百分比)
內存使用率:
free -m | awk '/Mem:/ {printf "%.2f", $3/$2*100}'
free -m
:以MB為單位顯示內存信息awk
計算已用內存占總內存的百分比
磁盤使用率:
df -h / | awk 'NR==2 {gsub("%","",$5); print $5}'
df -h /
:顯示根分區磁盤使用情況awk
提取使用率百分比
3.?日志記錄
echo "$(date '+%Y-%m-%d %H:%M:%S'): ..." >> /var/log/monitor.log
所有輸出都追加到日志文件
包含時間戳便于追蹤
4.?條件判斷
使用?
bc
?命令進行浮點數比較三個條件任一滿足即觸發告警:
CPU使用率 > 80%
內存使用率 > 80%
磁盤使用率 > 80%
5.?告警處理
生成告警描述信息
發送郵件到指定郵箱
記錄郵件發送結果(成功/失敗)
6.?正常情況
資源使用率正常時記錄"系統資源正常"
腳本詳情:
#!/bin/bash
#設置閾值
dateMax=80? ?
#獲取系統資源使用率
CPULimit=$(top -bn1 | grep "Cpu" | awk '{print 100- $8}')
RAMLimit=$(free -m | awk '/Mem:/ {printf("%.2f"), $3/$2*100}')
#CPU 內存 硬盤監控
if [ $(echo "$CPULimit > $dateMax" | bc) -eq 1 ] || \
[ $(echo "$RAMLimit > $dateMax" | bc) -eq 1 ] || \
[ $DISKLimit -gt $dateMax ]
then? ? title="資源告急"
desc="資源告急,CPU使用率高達${CPULimit}%,內存使用率高達${RAMLimit}%,磁盤使用率>高達${DISKLimit}%"
# 記錄告警信息到日志
echo "$(date '+%Y-%m-%d %H:%M:%S'): $desc" >> /var/log/monitor.log
#發送郵件
echo "$desc" | mailx -s "$title" "123456@qq.com"
#檢查郵件發送結果
if [ $? -eq 0 ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S'): 告警郵件發送成功" >> /var/log/monitor.log
else
echo "$(date '+%Y-%m-%d %H:%M:%S'): 告警郵件發送失敗" >> /var/log/monitor.log
fi
else
echo "$(date '+%Y-%m-%d %H:%M:%S'): 系統資源正常" >> /var/log/monitor.log
fi
2、監控系統中的IO await大于50進行郵件告警(可使用郵箱QQ)
腳本詳解
1. 配置參數部分
#!/bin/bash
# 配置參數
IOMax=50
EMAIL="123456@qq.com"
LOG_FILE="/var/log/io_monitor.log"
#!/bin/bash
: 指定使用Bash shell執行腳本IOMax=50
: 設置IO使用率閾值,超過50%觸發告警EMAIL
: 設置接收告警郵件的郵箱地址LOG_FILE
: 設置日志文件路徑
2. 獲取IO使用率
# 使用 iostat -x 獲取sda設備的IO使用率(%util)
IOLimit=$(iostat -x 1 2 | awk '/sda/ {print $NF}' | tail -1 | cut -d'.' -f1)
這條命令的詳細解析:
iostat -x 1 2
: 顯示擴展IO統計信息,每秒刷新一次,共顯示2次awk '/sda/ {print $NF}'
: 過濾包含"sda"的行,并打印最后一列(%util)tail -1
: 取最后一行(第二次采樣的結果)cut -d'.' -f1
: 去掉小數部分,只取整數
3. 記錄日常日志
# 記錄日志
echo "$(date '+%Y-%m-%d %H:%M:%S'): IO使用率 $IOLimit%" >> "$LOG_FILE"
將當前時間和IO使用率記錄到日志文件中。
4. 判斷和告警邏輯
# 判斷是否超過閾值
if [[ $IOLimit -gt? $IOMax ]]
then
title="IO告急"
desc="IO告急,當前IO使用率高達${IOLimit}%,超過閾值${IOMax}%"
??? # 記錄告警日志
echo "$(date '+%Y-%m-%d %H:%M:%S'): $desc" >> "$LOG_FILE"
??? # 發送郵件
echo -e "Subject: $title\n\n$desc" | msmtp "$EMAIL"
??? # 檢查發送結果
if [ $? -eq 0 ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S'): IO告警郵件發送成功" >> "$LOG_FILE"
else
echo "$(date '+%Y-%m-%d %H:%M:%S'): IO告警郵件發送失敗" >> "$LOG_FILE"
fi
fi
腳本詳情:
# 配置參數
#!/bin/bash
IOMax=50
EMAIL="123456@qq.com"
LOG_FILE="/var/log/io_monitor.log"
# 使用 iostat -x 獲取sda設備的IO使用率(%util)
IOLimit=$(iostat -x 1 2 | awk '/sda/ {print $NF}' | tail -1 | cut -d'.' -f1)
# 記錄日志
echo "$(date '+%Y-%m-%d %H:%M:%S'): IO使用率 $IOLimit%" >> "$LOG_FILE"
# 判斷是否超過閾值
if [[ $IOLimit -gt ?$IOMax ]]
then
title="IO告急"
desc="IO告急,當前IO使用率高達${IOLimit}%,超過閾值${IOMax}%"
# 記錄告警日志
echo "$(date '+%Y-%m-%d %H:%M:%S'): $desc" >> "$LOG_FILE"
# 發送郵件
echo -e "Subject: $title\n\n$desc" | msmtp "$EMAIL"
# 檢查發送結果
if [ $? -eq 0 ]; then
echo "$(date '+%Y-%m-%d %H:%M:%S'): IO告警郵件發送成功" >> "$LOG_FILE"
else
echo "$(date '+%Y-%m-%d %H:%M:%S'): IO告警郵件發送失敗" >> "$LOG_FILE"
fi
fi
3、監控系統中的網絡流量下載上傳超過10M(可變)進行郵件告警(可使用郵箱QQ)
詳細步驟解析
1. 變量初始化
bash
NIC="ens33"??????????????????? # 要監控的網絡接口名稱
LIMIT=10?????????????????????? # 限制值(單位:MB/s)
NATLimit=10??????????????????? # 用于判斷的閾值(單位:MB/s)
EMAIL_TO="123456@qq.com"?? # 告警郵件接收地址
2. 獲取初始網絡統計
bash
rx1=$(cat /sys/class/net/$NIC/statistics/rx_bytes)? # 獲取初始接收字節數
tx1=$(cat /sys/class/net/$NIC/statistics/tx_bytes)? # 獲取初始發送字節數
sleep 1???????????????????????????????????????????? # 等待1秒
3. 獲取第二次網絡統計并計算速率
bash
rx2=$(cat /sys/class/net/$NIC/statistics/rx_bytes)? # 獲取第二次接收字節數
tx2=$(cat /sys/class/net/$NIC/statistics/tx_bytes)? # 獲取第二次發送字節數
# 計算速率(字節/秒 → MB/秒)
rx_rate=$(( (rx2 - rx1) / 1024 / 1024 ))? # 下載速率
tx_rate=$(( (tx2 - tx1) / 1024 / 1024 ))? # 上傳速率
4. 顯示當前速率
bash
echo "上傳速率: ${tx_rate} MB/s"
echo "下載速率: ${rx_rate} MB/s"
5. 閾值判斷與告警處理
bash
if [[ $rx_rate -gt $NATLimit ]] || [[ $tx_rate -gt $NATLimit ]]; then
title="網絡監控"
desc="網絡帶寬告急,下行速率高達${rx_rate},上行速率高達${tx_rate}MB/s,已超過 ${LIMIT}MB/s 的限制"
echo "警告: $desc"
6. 郵件發送
bash
# 使用mailx發送郵件
(
echo "Subject: $title"
echo "From: system_monitor@$(hostname)"
echo "To: 123456@qq.com"? # 注意:這里與EMAIL_TO變量不一致
echo ""
echo "$desc"
echo ""
echo "監控時間: $(date '+%Y-%m-%d %H:%M:%S')"
echo "主機名: $(hostname)"
echo "網絡接口: $NIC"
echo "閾值限制: ${LIMIT}MB/s"
) | mailx -s "$title" "$EMAIL_TO" 2>/dev/null
7. 郵件發送結果檢查
bash
if [ $? -eq 0 ]; then
echo "郵件已發送 $EMAIL_TO"
else
echo "郵件發送失敗,請檢查 mailx 配置"
fi
#!/bin/bash
NIC="ens33"
LIMIT=10 ?# 單位 M/s
NATLimit=10 ? ? ? ? ?# 限制值(用于判斷)
EMAIL_TO="123456@qq.com" ?
# 取兩次字節數差值,算速率
rx1=$(cat /sys/class/net/$NIC/statistics/rx_bytes)
tx1=$(cat /sys/class/net/$NIC/statistics/tx_bytes)
sleep 1
rx2=$(cat /sys/class/net/$NIC/statistics/rx_bytes)
tx2=$(cat /sys/class/net/$NIC/statistics/tx_bytes)# 差值 -> 每秒字節數,再換算成 MB/s
rx_rate=$(( (rx2 - rx1) / 1024 / 1024 ))
tx_rate=$(( (tx2 - tx1) / 1024 / 1024 ))#引入上行速度和下行速度
echo "上傳速率: ${tx_rate} MB/s"
echo "下載速率: ${rx_rate} MB/s"
#閾值判斷
#網絡監控
if [[ $rx_rate -gt $NATLimit ]] || [[ $tx_rate -gt $NATLimit ]];then
title="網絡監控"
desc="網絡帶寬告急,下行速率高達${rx_rate},上行速率高達${tx_rate}MB/s,已超過 ${LIMIT}MB/s 的限制"
echo "警告: $desc" ? ? ??
#發送郵件
(
echo "Subject: $title"
echo "From: system_monitor@$(hostname)"
echo "To: 123456@qq.com"
echo ""
echo "$desc"
echo ""
echo "監控時間: $(date '+%Y-%m-%d %H:%M:%S')"
echo "主機名: $(hostname)"
echo "網絡接口: $NIC"
echo "閾值限制: ${LIMIT}MB/s"
) | mailx -a default "123456@qq.com" 2>/dev/null
# 檢查郵件是否發送成功
if [ $? -eq 0 ]; then ? ? ??
echo "郵件已發送 $EMAIL_TO"
else
echo "郵件發送失敗,請檢查 mailx 配置"
fi
fi
#!/bin/bash
NIC="ens33"
LIMIT=10 ?# 單位 M/s
NATLimit=10 ? ? ? ? ?# 限制值(用于判斷)
# 取兩次字節數差值,算速率
rx1=$(cat /sys/class/net/$NIC/statistics/rx_bytes)
tx1=$(cat /sys/class/net/$NIC/statistics/tx_bytes)
sleep 1
rx2=$(cat /sys/class/net/$NIC/statistics/rx_bytes)
tx2=$(cat /sys/class/net/$NIC/statistics/tx_bytes)
# 差值 -> 每秒字節數,再換算成 MB/s
rx_rate=$(( (rx2 - rx1) / 1024 / 1024 ))
tx_rate=$(( (tx2 - tx1) / 1024 / 1024 ))
#引入上行速度和下行速度
echo "上傳速率: ${tx_rate} MB/s"
echo "下載速率: ${rx_rate} MB/s"
#閾值判斷
#網絡監控
if [[ $rx_rate -gt $NATLimit ]] || [[ $tx_rate -gt $NATLimit ]];then
title="網絡監控"
desc="網絡帶寬告急,下行速率高達${rx_rate},上行速率高達${tx_rate}MB/s,已超過 ${LIMIT}MB/s 的限制"
echo "警告: $desc" ? ? ??
#發送郵件
(
echo "Subject: $title"
echo "From: system_monitor@$(hostname)"
echo "To: 1261316341@qq.com"
echo ""
echo "$desc"
echo ""
echo "監控時間: $(date '+%Y-%m-%d %H:%M:%S')"
echo "主機名: $(hostname)"
) | msmtp -a default "2654371993@qq.com" 2>/dev/null
# 檢查郵件是否發送成功
if [ $? -eq 0 ]; then ? ? ??
echo "郵件已發送"
else
echo "郵件發送失敗,請檢查 msmtp 配置"
fi
fi