用 df -p 获取标准格式数据,取第5列去%后校验数字再判断,超90%时用logger记日志预警。

怎么用 df 获取准确的可用空间数值
直接跑 df -h 看着方便,但脚本里不能依赖它——-h 会加单位(K/M/G),没法直接比较大小。必须用 df -P(POSIX 格式),保证字段对齐、无缩写、纯数字输出。
-
df -P / | tail -1取最后一行,避免头行干扰 - 第5列是已用百分比(如
87%),需用sed 's/%//'去掉百分号才能参与数值判断 - 第4列是剩余块数(
Available),单位是 1K blocks,若要换算成 GB,得除以 1024×1024 —— 但预警逻辑用百分比更稳妥,避免不同文件系统 block size 差异影响
Shell 脚本里怎么判断磁盘超限并触发提醒
别用 [ $used_pct -gt 90 ] 这种裸比较:如果 $used_pct 是空值或非数字(比如 df 失败时),Bash 会报错 integer expression expected,导致脚本中断。
- 先用
[[ "$used_pct" =~ ^[0-9]+$ ]]校验是否为纯数字 - 再用
if (( used_pct > 90 )); then做数值判断((( ))比[ ]更安全,支持直接算术) - 提醒方式优先选
logger -t "disk-alert" "root partition at ${used_pct}%",写入/var/log/messages,比单纯echo可靠——即使无人值守也能查日志 - 真要发邮件,用
mail -s "DISK FULL on $(hostname)" admin@example.com ,别依赖 GUI 工具(如 <code>notify-send),服务器通常没桌面环境
定时执行时为什么 df 结果和手动执行不一致
常见原因是 crontab 默认 PATH 极简(通常只有 /usr/bin:/bin),而某些系统上 df 在 /bin/df,没问题;但如果你脚本里写了 which df 或调用了 sudo df,cron 就可能找不到命令或权限失败。
- 脚本开头显式声明
PATH=/usr/local/bin:/usr/bin:/bin - 所有命令用绝对路径:
/bin/df、/usr/bin/logger、/bin/mail - 在 crontab 里测试:加一行
* * * * * /bin/bash -c '/path/to/check_disk.sh >> /tmp/disk.log 2>&1',立刻看/tmp/disk.log是否报command not found - 避免在脚本里用
sudo——改用crontab -e切到 root 用户下添加任务,更干净
为什么 /dev/shm 占用高却总被误报
/dev/shm 是基于内存的 tmpfs,它的“磁盘使用”本质是内存占用,且默认大小是 RAM 的一半。用 df 监控它会频繁触发误告警,尤其 Java 应用用了大量 DirectByteBuffer 时。
- 在
df命令后加-x tmpfs -x devtmpfs排除虚拟文件系统 - 或者明确只监控根分区:
df -P / | tail -1,而不是df -P全盘扫 - 若必须监控
/tmp,确认它是不是挂载为独立分区(findmnt /tmp),否则它只是/下的子目录,重复监控没意义
真正容易漏的是多挂载点场景:比如 /home 和 /var/log 分别挂了不同磁盘。一个脚本只盯 /,可能 /var/log 已满但完全没反应——得把关键路径列进数组,循环检查。










