linux 机器上df和du查看的磁盘空间占用不一致解决方法

181 阅读1分钟

有一台测试机,某天磁盘告警占用90%+,跟平时一样上机执行du -h --max-depth=1 .打算逐级查看目录文件占用,经过漫长等待,却发现根目录所有文件加起来才不到30%占用。

查了一下du跟df的区别,

1.  文件删除但进程仍在使用:如果有进程打开了某个文件并正在使用它,即使文件在文件系统中已被删除,`df` 仍会统计该文件占用的空间,但 `du` 不会。
1.  挂载点和文件系统差异:`df` 显示整个文件系统的使用情况,包括所有挂载点。而 `du` 只计算指定目录及其子目录的实际文件大小。
1.  硬链接:多个文件指向相同的数据块时,`du` 只会计算一次,而 `df` 会统计多次。
1.  未释放的磁盘空间:某些操作可能导致磁盘空间未被及时释放,`df` 能反映这种情况,`du` 则不能。
1.  文件系统的缓存和临时文件:一些文件系统会使用缓存或创建临时文件,这可能导致两者统计结果的差异。

恍然大悟,于是用lsof | grep deleted查看是否有一些占用被删除文件进程

image.png 还挺多的。

然后让ai帮我写个找到占用deleted文件且是python的进程pid,然后批量kill-9的脚本

for pid in $(sort -u <(lsof | grep "python.*deleted" | awk '{print $2}')); do kill -9 $pid; sleep 1; done

再用df查看一下,搞掂收工

image.png