今天在单位遇到一个问题,有一台服务器文件系统的磁盘使用率超过80%,因此打算清理一下没用的文件。
使用df检查发现/home目录占用了105G,而用du命令检查/home目录只占用了64G,整整差了41G!即使df与du命令的检查结果是可能会存在些许不同,但相差了这么多,明显是有问题了。通常导致这个问题的原因,当一个文件被删除后,在目录中已经不可见了,所以du就不会再统计它了。然而如果此时还有进程持有这个已经被删除了的文件的句柄,那么这个文件就不会真正在磁盘中被删除,这样df仍旧会统计这个被删除了的文件。
我们可以使用lsof命令(list open files)来检查被打开的文件,并grep下是否已经deleted(很不幸,检测是否deleted这个,并不是所有系统的lsof都支持的,我的mac就不会。 那样的话只能自己写个脚本一个一个文件去检查是否还在目录中了)
检查结果如上图,这两个pid为8363、8364的jsvc进程打开了已经被删除的日志文件catalina.out.8,而且这个文件有40G之大! =。=# 我怀疑是这个系统的开发人员以为写个定时任务删除了过期日志文件就好了,结果在程序中又没有关闭这个文件句柄,还接着往这个文件里面倒数据。。。
解决办法一是重启对应的进程,释放该文件句柄;二是使用命令清空文件$cat /dev/null > filename。