df 与 du 差值即“已删未释”空间;用 lsof +L1 找 deleted 文件;可 kill 进程或 echo “” > /proc/PID/fd/N 清空释放;预防需配置 logrotate 或应用内日志轮转。
确认是不是真没释放:df 和 du 对不上
执行 df -h 看磁盘使用率,再用 du -sh /* 2>/dev/null | sort -h 统计根下各目录真实大小。如果 df 显示用了 95%,但 du 加起来才 60%,差值大概率就是“已删未释”的空间。
注意:du 不会统计被进程占用的已删文件,所以它永远比 df 少;这个差值不是误差,是线索。
找谁在锁着已删文件:lsof + grep deleted
lsof 是唯一能看见“幽灵文件”的命令——那些路径显示为 /var/log/app.log (deleted) 的条目,就是罪魁祸首。
-
lsof +L1:只列标记为 deleted 的打开文件(推荐,快且准) -
lsof /var/log | grep deleted:限定路径查日志类场景 - 输出中关键列:
PID(进程号)、COMMAND(进程名)、FD(文件描述符,如3w)、最后一列(deleted)
别信 ls /var/log/app.log 找不到就以为完事了——只要进程还开着它,空间就钉死不放。
释放空间的两种实操选择:杀进程 or 清内容
选哪个,取决于你能不能停服务: