Linux幽灵文件:rm 删了,磁盘不释放?
幽灵文件的本质:当你用 rm 删除一个文件时,如果这个文件正被某个进程打开使用,文件只是从目录中消失了名字,但数据块依然完好地占据着磁盘,直到进程关闭文件或被终止才会真正释放空间。
为什么 df 和 du 对不上:df 统计的是文件系统的真实使用情况,而 du 统计的是目录树中的文件大小总和。幽灵文件已不在目录树中,du 扫不到它,但空间确实被占用,于是出现 df 显示磁盘快满了、du 却找不到大文件的诡异现象。
如何排查:使用 lsof +L1 命令可以列出所有“链接计数小于1”的文件,也就是那些已被删除但仍被进程打开的文件句柄。配合 sort -k7 -rn 按大小排序,最大的几个通常就是吃空间的元凶。
如何修复:找到占用幽灵文件的进程后,有两个选择——直接 kill 掉进程释放空间;或者用 : > /proc/PID/fd/FD 清空文件内容而不终止进程,数据清零后空间立刻释放。
常见来源与预防:日志轮转后服务没重启、临时文件创建后立刻 unlink、调试脚本输出被删但命令还在跑,都是幽灵文件的典型来源。