系统巡检脚本
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
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 程序员小航
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果