Linux 系统本身没有内置“磁盘空间增长趋势报告”功能,通常需要通过 cron 定时执行 df -h 并附加时间戳写入日志,再结合 awk 等工具做后续分析;df 只能提供某一时刻的空间快照,无法直接体现历史增长变化,真正关键的是高频采集、持续监控与及时处理。

Linux 本身并不自带“空间增长趋势报告”功能,想查看磁盘空间增长趋势,必须依靠命令组合、定时采集和基础分析来实现。系统中没有现成可用的 df --trend 或类似命令。
为什么 df 命令不能直接看趋势
df 属于快照型工具,每次执行只会返回当前时刻各挂载点的磁盘使用率(Use%)以及已用、可用块数。它不会保存历史数据,也不会自动比较前后变化。所谓“空间增长趋势”,本质上就是把多个时间点的 df -h 输出做差值、排序和对比——这一部分必须额外补上。
- 直接运行
df -h只能知道“当前用了多少空间”,却看不出“比昨天多了多少 GB” - 如果只执行一次
du -sh /var/log,同样无法判断这个目录是否在最近三天内增长了 40% - 不少运维人员误以为
df -i能反映日志增长趋势,但 inode 用尽通常是由大量小文件堆积造成的,和大文件持续膨胀并不是同一个问题
用 cron + df + 时间戳生成简易趋势日志
如果想用最轻量、无需额外安装软件的方式实现 Linux 磁盘空间趋势监控,可以每小时把 df -h 的结果追加写入带日期的日志文件,后续再用 awk、Excel 或其他工具按时间轴分析。
- 先创建日志目录:
mkdir -p /var/log/df-history - 添加定时任务:
0 * * * * df -h | awk 'NR>1 {print strftime("%Y-%m-%d %H:%M"), $0}' >> /var/log/df-history/df-$(date +%F).log 2>/dev/null - 关键点:
NR>1用于跳过表头,strftime负责插入时间戳,避免依赖 shell 的$(date)在 cron 环境中异常或失效 - 查看某个分区最近 5 次的空间变化:
grep '/$' /var/log/df-history/df-*.log | tail -5
快速识别“正在涨”的目录(非全盘扫描)
与其等待 du 扫描整个 /var,更高效的做法是重点盯住已知高风险路径,结合修改时间和文件大小两个维度,快速判断哪些目录或文件正在持续增长。
- 查找过去 24 小时内明显变大的日志文件:
find /var/log -type f -mtime -1 -size +10M -ls 2>/dev/null - 查找已被进程打开但实际已删除、仍持续写入的“幽灵文件”(常见于未正确轮转的 journal 或 nginx access.log):
lsof +L1 | grep deleted - 确认某个文件是否仍在不断写入:
ls -l /var/log/syslog; sleep 10; ls -l /var/log/syslog—— 如果文件大小发生变化,说明它仍在活跃增长
真正要警惕的不是“空间多”,而是“增长快且不可控”
磁盘空间膨胀的速度往往比预期更快。比如一个 /var/log/journal 目录,可能在短短 3 小时内就从 2GB 激增到 8GB,而这时 df -h 可能只冷冰冰地显示“已用 65%”,完全掩盖了异常增长的节奏。查看 Linux 磁盘空间增长趋势的真正意义,不是事后分析原因,而是为了提前发现问题并及时干预。因此,数据采集频率通常比报表形式更重要:每 15 分钟记录一次 df -B1 /(保证字节级精度),实际价值往往远高于每天手动执行一次 ncdu。
