在日常运维中,经常遇到磁盘空间满,发现占用磁盘空间大的文件已经被删除了,但df -Th查看磁盘空间还是满,没有释放出来 但du -sh 查看时发现空间已经腾出来了 通常这种情况都是文件被删除,但是还被进程占用,造成du与df结果不一致。 du -sh * 和df -Th显示大小不一样,一般而言,df显示的使用空间要大于du 因为:当一个文件被删除的时候,在文件系统的目录中已经不可见了,所以du就不会再统计它了。 然而如果此时还有运行的进程持有这个已经被删除了的文件的句柄,那么这个文件就不会真正在磁盘中被删除,分区超级块中的信息也就不会更改。这样df仍旧会统计这个被删除了的文件。![]()
## lsof |grep delete 查看那些文件被删除了,还在被进程调用。
然后通过 ls -l /proc/PID/fd/* | grep 文件名,找到相应文件句柄; ls -l /proc/5541/fd/* |grep "/opt/paraview/esc/log/ESC-SSO_15000.log.2021-06-29.023366434267219418.tmp"
清除文件内容 echo > /proc/PID/fd/FD_NUM echo >/proc/5541/fd/1 echo >/proc/5541/fd/2
这个操作不会将文件删除,而是通过将文档内容清空的方法释放空间,文件还是存在的。
### cat /proc/5541/fd/1 ## 这里面的内容就是 后面对应文件的内容,在此还可以恢复文件。