linux下df和du执行结果差异原因

今天开发机磁盘满了,df了一把100%磁盘已满,但du了一把却只用了50%,异常诡异。

使用df命令查看结果(100%)如下
[shenjian@dev02 ~]$ df -h
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda2 33G 33G 33G 100% /
/dev/sda1 965M 30M 886M 4% /boot

使用du命令查看结果(50%)如下
[root@dev02 /]# du -sch /
16G /

@郝新斌 同学与@李茂 同学反馈的意见比较有参考价值:
(1)du命令不考虑元数据,而df命令则查看文件系统的磁盘分配情况。df命令获得真正的文件系统数据,而du命令只查看文件系统的部分情况。
(2)如果用户删除了一个正在运行的应用所打开的某个目录下的文件,则du命令返回的值显示出减去了该文件后的目录的大小。但df命令并不显示减去该文件后的大小,直到该运行的应用关闭了这个打开的文件,df返回的值才显示出减去了该文件后的文件系统的使用情况。
对于上述情况(2),常见的场景是,删除了一个很大的正在写入的tomcat的access日志,du显示的结果会把日志大小减去,而df则仍会包含该日志的大小(实际上tomcat仍引用了该文件的句柄)。

于是,查看了一下,哪些被删除的文件,却还在被程序引用着:
lsof |grep deleted

结果显示,一个我的logsvr程序(跑了几个月了),和一个实习生写的web-server程序(实习大作业)值得怀疑。
最终定位出,是web-server程序中的一个while(pid=fork())手误写成了while(pid==fork()),导致while内一直fork进程,直到将系统资源吃干。并且该进程已经成了zombie进程,无法kill掉,重启开发虚拟机后,问题得到解决。

评论关闭。