有一台测试机,某天磁盘告警占用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查看是否有一些占用被删除文件进程
还挺多的。
然后让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查看一下,搞掂收工