linux磁盘预警脚本核心是用df -p -b1精准提取真实使用率,分级监控关键目录,结合可靠邮件通知与健壮性机制实现无人值守。

Linux 文件系统容量预警脚本不靠复杂工具,靠精准判断和可靠执行。核心是用 df 提取真实使用率,避开挂载点混淆、单位干扰和阈值误判,再结合邮件通知形成闭环。
抓准关键字段,避免 df 输出陷阱
df 默认输出含表头、空格不均、单位混杂(如 1K/MB/GB),直接 grep 或 awk 容易出错。推荐固定格式提取:
- 用
df -P(POSIX 格式)保证列对齐,避免因文件系统名过长导致字段偏移 - 用
df -B1统一为字节单位,彻底规避 MB/GB 转换误差 - 优先匹配挂载点而非设备名:例如
df -P | awk '$5 > 80 && $6 == "/" {print $5}'比grep "/$"更稳,因为某些系统根分区可能显示为/dev/mapper/centos-root - 过滤掉伪文件系统(如 tmpfs、devtmpfs):加条件
$1 !~ /^(none|tmpfs|devtmpfs|cgroup)/
分级阈值 + 多目录监控
单一阈值不够实用。生产环境需区分“提醒”“警告”“紧急”三级,并覆盖关键路径:
- 定义变量:
WARN=80 CRIT=90 EMERG=95 - 监控列表可配置化:
MONITOR_DIRS=("/" "/var/log" "/home" "/data") - 对每个目录单独判断:用
df -B1 "$dir" 2>/dev/null避免因目录不存在报错中断脚本 - 记录触发级别:低于 90% 打印 warn 日志;≥90% 但<95% 发邮件告警;≥95% 则同时发邮件+写入系统日志(
logger -p local0.err "Disk full risk on $dir")
邮件告警必须可靠落地
很多脚本写了 mail 却收不到,问题常出在三处:
- 没装基础邮件工具:CentOS/RHEL 运行
yum install mailx,Ubuntu/Debian 用apt install mailutils - 没配 SMTP 认证:仅
mail -s不够,需提前在/etc/mail.rc中设置set smtp=smtp://xxx:25和认证凭据(推荐用应用专用密码,非邮箱登录密码) - 忽略执行上下文:crontab 中运行脚本时 PATH 可能不包含
/usr/bin,建议脚本内用绝对路径调用命令,如/bin/df、/usr/bin/mail - 加兜底机制:若 mail 命令失败(
$? != 0),改用echo写入本地告警文件,并触发logger记录,确保有人能发现
增强健壮性的小细节
让脚本真正“无人值守”,得处理边界情况:
- 开头加
set -e -u -o pipefail:任意命令失败即退出,未定义变量报错,管道任一环节失败整体失败 - 检查
df是否返回非零:有些 NFS 挂载点卡住时df会 hang 或失败,加超时控制timeout 10 df -P - 避免重复告警:同一目录连续 3 次超阈值才发邮件,中间用临时文件记录上次触发时间与状态
- 支持 dry-run 模式:加
-n参数只打印将要执行的操作,方便测试











