du 与 df 不一致,删除文件后,空间未释放

因空间不足,在自己的虚拟机上直接删了库的目录,释放一些空间,反正是自己玩的东西,不用跑路。(这不是重点)

查看存储,df -h, 很是明显的/home 的存储并未释放

Linux没有回收站功能,我们的线上服务器所有要删除的文件都会首先移动到系统/tmp目录下,然后定期清除/tmp目录下的数据。 查看了一下,很明显并不是因为这个机制。(况且根目录根本的存储来看,也可以排除是这个原因)

一般说来不会出现删除文件后空间不释放的情况,但是也存在例外,比如文件被进程锁定,或者有进程一直在向这个文件写数据等等。Linux下文件的存储机制和存储结构:一个文件在文件系统中的存放分为两个部分:数据部分和指针部分,指针位于文件系统的meta-data中,数据被删除后,这个指针就从meta-data中清除了,而数据部分存储在磁盘中,数据对应的指针从meta-data中清除后,文件数据部分占用的空间就可以被覆盖并写入新的内容,之所以出现删除文件后,空间还没释放,就是因为有进程还在一直向这个文件写入内容,导致虽然删除了文件,但文件对应的指针部分由于进程锁定,并未从meta-data中清除,而由于指针并未被删除,那么系统内核就认为文件并未被删除,因此通过df命令查询空间并未释放也就不足为奇了。

通过lsof|grep deleted命令获取到已经被删除但是仍然被应用程序占用的文件列表,(呕吼,够多)果然直接删除目录会有些问题。

 对待这种进程不停对文件写日志的操作,要释放文件占用的磁盘空间,最好的方法是在线清空这个文件。通过这种方法,磁盘空间不但可以马上释放,也可保障进程继续向文件写入日志。(但此种情况是我们已经删除,并且我不想要它了)所以使用第二种方式,直接杀死。

lsof|grep delete|awk '{print "kill -9 "$2}'|sh

 查看存储,已经恢复正常。

思考:删除后,发现有进程对日志操作,怎么操作?

 

原文地址:https://www.cnblogs.com/Leo-Cjh/p/13601668.html