本文目录导读:

磁盘空间检测报警通常通过监控系统或自定义脚本实现,核心思路是:定期检查磁盘使用率,当超过某个阈值(如80%、90%)时,触发通知(邮件、短信、IM消息等)。
以下是几种常见且实用的实现方案:
使用系统自带的工具 + 脚本(最通用、最灵活)
适合对成本敏感、没有部署大型监控平台的环境,或需要自定义特定逻辑的场景。
(1) 核心命令(Linux/Unix 系统)
# 查看磁盘使用情况,-h 表示人类可读格式
df -h
# 只获取使用率(获取 / 分区的使用率,去掉 % 号)
df -h / | awk 'NR==2 {print $5}' | sed 's/%//'
(2) 一个简单的bash报警脚本
创建一个脚本 disk_alert.sh,设置为定时任务(cron)。
#!/bin/bash
# 配置:设置报警阈值(百分比),85%
THRESHOLD=85
# 要监控的分区列表(根据需要添加或修改)
PARTITIONS="/ /home /var"
# 接收报警的邮箱
EMAIL="admin@example.com"
# 循环检查每个分区
for PART in $PARTITIONS; do
# 获取当前分区的使用率(整数)
USAGE=$(df -h $PART | awk 'NR==2 {print $5}' | sed 's/%//')
# 如果使用率大于等于阈值
if [ $USAGE -ge $THRESHOLD ]; then
# 获取具体的磁盘使用信息作为邮件正文
DETAIL=$(df -h $PART)
# 发送报警邮件(需要系统配置好 mail 命令,mailutils)
echo "警告:分区 $PART 使用率已达 ${USAGE}%,超过阈值 ${THRESHOLD}%。\n详情:\n$DETAIL" | mail -s "磁盘空间报警 - $PART" $EMAIL
# 或者使用 curl 发送到钉钉/企业微信机器人(见下方进阶)
fi
done
(3) 设置定时任务(Crontab)
# 编辑 crontab crontab -e # 添加一行,每 5 分钟执行一次(注意脚本路径要写绝对路径) */5 * * * * /home/scripts/disk_alert.sh
使用成熟的监控系统(专业、统一管理)
如果有运维或监控团队,使用专业平台是最佳实践,可以做到可视化、历史趋势、批量注册、自动处理。
-
Prometheus + Grafana + AlertManager(云原生首选)
- 使用
node_exporter收集包含磁盘在内的系统指标。 - 在 Prometheus 或 AlertManager 中配置报警规则:
# 告警规则示例 (PrometheusRule) alert: DiskSpaceLow expr: (1 - (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"})) * 100 > 85 for: 5m labels: severity: warning annotations: summary: "磁盘空间不足 (实例 {{ $labels.instance }})" description: "根分区磁盘使用率已超过 85% (当前值: {{ $value }}%)" - 通过 AlertManager 发送到钉钉、邮件、Slack 等。
- 使用
-
Zabbix / Nagios / Cacti(传统企业常用)
自带“磁盘空间”监控模板,只需将主机加入监控,配置报警动作(Action)和媒介(Media,如邮件、短信网关)即可,这是最省事的方案之一。
-
云厂商自带服务(阿里云、腾讯云、AWS、Azure)
- 控制台报警:在云监控页面,选择“磁盘使用率”指标,设置阈值报警。
- 云助手:在云服务器内配合脚本进行检测。
- 优势:开箱即用,与云资源强绑定,不需要自己搭建基础设施。
更现代化的通知方式(替代邮件)
很多场景下,邮件不如即时通讯工具直观,以上脚本(方案一)可以轻松扩展。
(1) 发送到企业微信机器人
WEBHOOK_URL="https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=你的key"
curl -s -H "Content-Type: application/json" -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"磁盘报警:分区 $PART 使用率已超 ${THRESHOLD}%\"}}" $WEBHOOK_URL
(2) 发送到钉钉机器人
DINGTALK_URL="https://oapi.dingtalk.com/robot/send?access_token=你的token"
curl -s -H "Content-Type: application/json" -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"磁盘报警:分区 $PART 使用率已超 ${THRESHOLD}%\"}}" $DINGTALK_URL
(3) 发送 Pushbullet 或 Server酱(个人通知神器)
- 这类服务通常是跑在公网上的手机App或小程序,你的服务器通过HTTPS调用其API,就能直接把报警推送到手机上。
一些关键的“好习惯”和建议
- 不要只监控根分区(/):** 业务数据通常放在
/data,/home,/var/log等分区,它们的爆满风险往往比系统盘高得多,而且后果可能更直接(如日志写爆导致无报错闪退)。 - 设置不同的阈值:
WARNING (警告):85%,提醒你该清理了。CRITICAL (严重):92-95%,需要立刻处理。PANIC (灾难):97%+,系统或服务可能马上挂掉。
- 延迟报警(For/Duration): 磁盘使用率偶尔会因大文件写入瞬间飙升,但很快回落,不要因为一次采样就报警,可以设置为持续超过阈值N分钟(如5分钟)再触发,避免干扰。
- 结合日志轮转(Logrotate)使用: 磁盘报警不应只靠通知,最根本的预防措施是配置好日志切割。
- 提前配置好
logrotate或cronolog,对/var/log/目录下的日志进行归档、压缩和清理,这样报警发生前,问题往往就被自动解决了。
- 提前配置好
- 紧急响应: 如果磁盘真的满了,服务已经受影响,往往报警反而收不到(比如系统连发送邮件的进程都无法启动),这时候可以考虑:
- 紧急脚本(在内存中运行的检查)或通过带外监控(如IPMI、云控制台VNC)直接进服务器清理。
- 在
/root等系统保留分区预留少量空间(通常默认就有5%留给root,df命令里的使用率是基于100%总量的,注意到这一点)。
选哪个方案?
- 个人/小团队、单台服务器:方案一脚本 + 钉钉/企微机器人,0成本,5分钟就能搭好。
- 中等规模、多台服务器、有运维基础:Prometheus + Grafana + AlertManager 或 Zabbix,这是生产环境的标准答案,值得花时间投入。
- 云上环境最省心:直接使用云监控控制台 + 报警规则,不需要自己写脚本,高可用性由云平台保障。