1. 磁盘使用率监控

# 钉钉机器人 Webhook
WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx"

send_ding() {
    msg="$1"
    curl -s "$WEBHOOK" \
        -H 'Content-Type: application/json' \
        -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"[$(hostname)] $msg\"}}" >/dev/null
}


#!/bin/bash
WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx"
send_ding(){ msg="$1"; curl -s "$WEBHOOK" -H 'Content-Type: application/json' \
-d "{\"msgtype\":\"text\",\"text\":{\"content\":\"[$(hostname)] $msg\"}}" >/dev/null; }

use=$(df -h / | awk 'NR==2{gsub("%","",$5);print $5}')
[ "$use" -gt 80 ] && send_ding "磁盘使用率 ${use}% 超过阈值" || echo "磁盘正常: ${use}%"

2. 内存监控

#!/bin/bash
WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx"
send_ding(){ msg="$1"; curl -s "$WEBHOOK" -H 'Content-Type: application/json' \
-d "{\"msgtype\":\"text\",\"text\":{\"content\":\"[$(hostname)] $msg\"}}" >/dev/null; }

mem=$(free | awk '/Mem/{printf("%.0f",$3/$2*100)}')
[ "$mem" -gt 70 ] && send_ding "内存使用率 ${mem}% 超过阈值" || echo "内存正常: ${mem}%"

3. CPU负载监控

#!/bin/bash
WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx"
send_ding(){ msg="$1"; curl -s "$WEBHOOK" -H 'Content-Type: application/json' \
-d "{\"msgtype\":\"text\",\"text\":{\"content\":\"[$(hostname)] $msg\"}}" >/dev/null; }

loadavg=$(awk '{print $1}' /proc/loadavg)
(( $(echo "$loadavg > 2" | bc -l) )) && send_ding "CPU负载过高(${loadavg})" || echo "负载正常: ${loadavg}"

4. 网络带宽监控

#!/bin/bash
IF=eth0  
WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx"
send_ding(){ msg="$1"; curl -s "$WEBHOOK" -H 'Content-Type: application/json' \
-d "{\"msgtype\":\"text\",\"text\":{\"content\":\"[$(hostname)] $msg\"}}" >/dev/null; }
# 读取第一次网络流量数据(rx1 / tx1)
rx1=$(awk -v i=$IF '$0~i{print $2}' /proc/net/dev)
tx1=$(awk -v i=$IF '$0~i{print $10}' /proc/net/dev)

# 等待 1 秒
sleep 1

# 读取第二次网络流量数据(rx2 / tx2)
rx2=$(awk -v i=$IF '$0~i{print $2}' /proc/net/dev)
tx2=$(awk -v i=$IF '$0~i{print $10}' /proc/net/dev)

# 计算 1 秒内的流量差值(MB/s)
rx=$(( (rx2-rx1)/1024/1024 ))  # MB/s
tx=$(( (tx2-tx1)/1024/1024 ))

if [ "$rx" -gt 100 ] || [ "$tx" -gt 100 ]; then
    send_ding "带宽高:RX=${rx}MB/s TX=${tx}MB/s"
else
    echo "带宽正常:RX=${rx}MB/s TX=${tx}MB/s"
fi


# 总结:
# rx1 是网卡接收流量总字节数(累计值)
# tx1 是网卡发送流量总字节数(累计值)

5. 合并脚本

#!/bin/bash
# Author: sun
# Usage: chmod +x monitor.sh && ./monitor.sh

# ===== 配置 =====
WEBHOOK="https://oapi.dingtalk.com/robot/send?access_token=xxxxxxxx" 
IF=eth0               
DISK_THRESHOLD=80 
MEM_THRESHOLD=70      
LOAD_THRESHOLD=2     
NET_THRESHOLD=100    

# ===== 钉钉通知函数 =====
send_ding(){
    msg="$1"
    curl -s "$WEBHOOK" \
        -H 'Content-Type: application/json' \
        -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"[$(hostname)] $msg\"}}" >/dev/null
}

# ===== 磁盘监控 =====
disk_use=$(df -h / | awk 'NR==2{gsub("%","",$5);print $5}')
if [ "$disk_use" -gt "$DISK_THRESHOLD" ]; then
    send_ding "磁盘使用率 ${disk_use}% 超过 ${DISK_THRESHOLD}%"
else
    echo "磁盘正常: ${disk_use}%"
fi

# ===== 内存监控 =====
mem_use=$(free | awk '/Mem/{printf("%.0f",$3/$2*100)}')
if [ "$mem_use" -gt "$MEM_THRESHOLD" ]; then
    send_ding "内存使用率 ${mem_use}% 超过 ${MEM_THRESHOLD}%"
else
    echo "内存正常: ${mem_use}%"
fi

# ===== CPU负载监控 =====
loadavg=$(awk '{print $1}' /proc/loadavg)
if (( $(echo "$loadavg > $LOAD_THRESHOLD" | bc -l) )); then
    send_ding "CPU负载 ${loadavg} 超过 ${LOAD_THRESHOLD}"
else
    echo "负载正常: ${loadavg}"
fi

# ===== 网络带宽监控 =====
rx1=$(awk -v i=$IF '$0~i{print $2}' /proc/net/dev)
tx1=$(awk -v i=$IF '$0~i{print $10}' /proc/net/dev)
sleep 1
rx2=$(awk -v i=$IF '$0~i{print $2}' /proc/net/dev)
tx2=$(awk -v i=$IF '$0~i{print $10}' /proc/net/dev)

rx=$(( (rx2-rx1)/1024/1024 ))  # MB/s
tx=$(( (tx2-tx1)/1024/1024 ))

if [ "$rx" -gt "$NET_THRESHOLD" ] || [ "$tx" -gt "$NET_THRESHOLD" ]; then
    send_ding "带宽高:RX=${rx}MB/s TX=${tx}MB/s"
else
    echo "带宽正常:RX=${rx}MB/s TX=${tx}MB/s"
fi