磁盘空间告警时应按“定位→判断→安全释放”流程处理:先用df -h确定满载分区,再用du -shx和find精准定位大文件,最后通过lsof验证、truncate清空或journalctl等安全清理。
磁盘空间告警时,直接删文件往往不释放空间,尤其当文件正被进程占用——删的是目录项,但 inode 和数据块仍被持有。真正有效的清理,是“定位 → 判断 → 安全释放”,而不是“找到就删”。
快速定位真实占用大户
别一上来就 find / -size +1G:它会卡在 /proc、/sys,还可能跨挂载点误扫 NFS 或容器卷。更稳的起点是:
- 先用 df -h 看哪块分区满了,再针对性查,比如 df -h /var
- 查一级子目录总和:du -shx /* 2>/dev/null | sort -hr | head -5(-x 防跨分区,2>/dev/null 屏蔽权限错误)
- 怀疑日志或缓存时,限定路径:du -shx /var/log/* /tmp/* 2>/dev/null | sort -hr | head -10
精准找出单个超大文件
du 只能看目录级汇总,真正“吃空间”的常是单个暴增文件(如 nohup.out、core dump、滚动日志)。用 find 更准:
- 查大于 1G 的普通文件:find /var -xdev -type f -size +1G -ls 2>/dev/null
- 加时间过滤避开活跃日志:find /tmp -type f -size +500M -mtime +7 -ls
- 只看前几条预览:find /home -type f -size +2G -print | head -n 3,确认路径再操作
删之前必须确认三件事
误删可能中断服务或丢失数据,动手前务必验证:
-
是否被进程打开? 运行 lsof /path/to/file 或 lsof +L1(查已删但未释放的文件)
-
是否属于当前分区? df /path/to/file 确认路径归属,避免删错挂载点
-
是否可安全清空而非删除? 对正在写入的日志,优先用 truncate -s 0 /path/to/file 或 > /path/to/file,保留句柄不中断服务
安全删除与替代方案
确认无风险后,再执行清理:
- 交互式删除(推荐):find /path -name "*.log" -size +100M -ok rm -f {} ;,每删一个都确认
- 批量删但限范围:find /var/log -name "old_*.log" -mtime +30 -delete
- 系统级日志别硬删:journalctl --vacuum-size=300M 清 systemd 日志,logrotate 配置自动轮转