Shell脚本实现轻量可靠系统监控:用top/mpstat、free、df采集CPU、内存、磁盘使用率,通过阈值判断触发邮件或Webhook告警,并支持去重与日志轮转。

用 Shell 脚本实现基础系统监控并触发告警,关键在于轻量、可靠、易部署。不需要复杂框架,几个核心命令配合条件判断就能完成 CPU、内存、磁盘使用率的实时检查,并在超限时通过邮件或 Webhook 发送通知。
一、监控指标采集:用标准命令获取真实数据
Shell 中不依赖外部工具也能拿到准确指标:
-
CPU 使用率:用
top -bn1 | grep '%Cpu' | awk '{print $2}' | cut -d'%' -f1获取最近一次的用户态 + 系统态占用(排除 idle),更稳可用mpstat 1 1 | awk '/Average:/ {print 100-$12}'(需 sysstat) -
内存使用率:避免只看
free -m的 used,应计算(total - available) / total * 100,用free | awk '/^Mem:/ {printf "%.0f", ($2-$7)/$2 * 100}' -
磁盘使用率:用
df -h | awk '$5 > 85 && /\/$/ {print $5, $1}'监控根分区;若需多路径,可指定df -h / /home | tail -n +2避免表头干扰
二、阈值判断与告警触发:简洁逻辑防误报
每个指标单独判断,满足条件才执行通知,避免耦合:
- 设统一阈值变量,如
CPU_WARN=85、MEM_WARN=90、DISK_WARN=85 - 用
if [ $(cpu_usage) -gt $CPU_WARN ]; then send_alert "CPU high: $(cpu_usage)%"; fi结构,函数封装采集和发送逻辑 - 加简单去重:记录上次告警时间戳,10 分钟内同类型告警不重复发(
[[ $(($(date +%s) - $(cat /tmp/last_cpu_alert 2>/dev/null))) -lt 600 ]] && exit)
三、通知方式选择:邮件最通用,Webhook 更灵活
根据环境选一种即可,无需都配:
-
发邮件:用
mail -s "ALERT: CPU >85%" admin@example.com ,确保系统已配置 sendmail 或 msmtp -
发钉钉/企微:构造 JSON 用 curl 调用 Webhook,例如钉钉:
curl -H 'Content-Type: application/json' -X POST --data '{"msgtype": "text", "text": {"content": "【告警】内存使用率: '"$mem_pct"'%"}}' $DINGTALK_URL - 敏感信息如 URL、邮箱密码,统一放在
/etc/monitor.conf并chmod 600,脚本中source /etc/monitor.conf
四、部署与运行:后台常驻 + 定时检查
不依赖 systemd 也能稳定运行:
- 用
while true; do ./check.sh; sleep 300; done &启动为后台进程,配合 nohup 或 systemctl user service 更稳妥 - 写入 crontab 每 5 分钟执行一次更省心:
*/5 * * * * /opt/bin/check.sh >> /var/log/monitor.log 2>&1 - 日志保留最近 7 天:
find /var/log/monitor.log* -mtime +7 -delete可加入脚本末尾
脚本写完后,先手动运行验证输出和告警路径,再放开阈值测试一次真实触发。不复杂但容易忽略的是权限、路径硬编码和空格处理——所有变量引用加双引号,df 和 free 输出列数变动时用正则或固定字段索引更健壮。


















