df -Th与du -sh空间大小不一致

  • Post author:
  • Post category:其他


一 问题现象

在日常运维中,经常遇到磁盘空间满,发现占用磁盘空间大的文件已经被删除了,但df -Th查看磁盘空间还是满,没有释放出来

但du -sh 查看时发现空间已经腾出来了

二 问题原因

通常这种情况都是文件被删除,但是还被进程占用,造成du与df结果不一致。

du -sh * 和df -Th显示大小不一样,一般而言,df显示的使用空间要大于du

因为:当一个文件被删除的时候,在文件系统的目录中已经不可见了,所以du就不会再统计它了。

然而如果此时还有运行的进程持有这个已经被删除了的文件的句柄,那么这个文件就不会真正在磁盘中被删除,分区超级块中的信息也就不会更改。这样df仍旧会统计这个被删除了的文件。

三 问题解决

1 首先找到问题所在进程,通过以下命令查找

lsof |grep deleted

列出来的这些文件,表示已经删除,但实际上进程还在使用。

处理办法通常是停止占用文件的进程。

2 处理办法

但是如果进程不能被停止呢?业务在使用,无法重启进程或服务 另一个处理办法就是通过清空文件释放空间。

处理办法如下:

通过lsof | grep deleted 找到未能删除掉的文件,确定占用的进程号;

#若没有lsof命令 yum install lsof -y

然后通过 ls -l /proc/PID/fd/* | grep 文件名,找到相应文件句柄; 清除文件内容 echo > /proc/PID/fd/FD_NUM

这个操作不会将文件删除,而是通过将文档内容清空的方法释放空间,文件还是存在的。

ls -l /proc/PID/fd/* | grep catalina 找到相应文件句柄,并使用echo > 方式清除 echo > /proc/28283/fd/1 echo > /proc/28283/fd/2

这时再df -PTh查看可以看到已经与du -sh大小基本一致,问题得到解决。



版权声明:本文为u013380694原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。