Linux中du、df显示不一致问题
最近在做关于Q博士的项目的时候,用到了docker进行部署,对于后端服务可能会经常变动,于是将docker容器的jar包与宿主机目录下的jar包进行绑定,之后每次需要更新的时候替换掉原来的jar包,然后重启容器即可。当我使用docker logs -f 查看容器日志时,发现需要遍历原来所有的日志,对于运行了很长时间的容器来说,光是遍历就要花很长时间,虽然可以用 --tail 100 只查看尾部100行,但是日志越来越大肯定会撑爆磁盘,这时我想要清除日志文件,发现使用du -sh 和 df -h 统计的结果不一致,于是搜索了下相关的信息,这篇博文介绍的非常清晰https://www.linuxidc.com/Linux/2018-03/151600.htm
1、du统计的原理
(1)如果统计目录下挂载了其他文件系统,那么也会对这个文件系统进行统计。
(2)如果文件被删除,即使被其他进程引用了,du命令也无法对其统计。因为stat命令找不到这个文件。
(3)可以跨分区统计某些你想统计的文件大小总和。因为它们都能被stat找到并统计。
2、df统计的原理
(1)当某个文件系统下挂载了其他分区,df不会把这个分区也统计进去。
(2)由于df每次统计都是读取superblock,所以df对文件系统中的某个文件进行统计时,会自动转为统计这个文件系统的信息。
(3)df会统计已删除但却仍有进程引用的文件。
从以上原理可以看出,du统计的结果并不总是比df小,因为du会统计目录下的挂载文件,而df不会。然而du不会
统计已经被删除但仍然被进程使用的文件,而df会统计。
针对于上述docker日志,如果不想清空日志文件,使用 echo "" > 即可,因为使用rm -rf不会释放空间(docker进程仍然占用),除非重启容器。