如何解决Linux系统文件已删除但空间未释放

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何解决Linux系统文件已删除但空间未释放相关的知识,希望对你有一定的参考价值。

linux是虽然删除文件,其实只删除文件和系统目录结构的链接。那么如果有程序在读取这个文件,那么文件还是存在,没有删除掉文件出在在读取的状态,还是占用磁盘空间的,只有让程序不读取这个文件了,才能完整的释放文件所占用的空间,所以只有从其服务或杀死服务的进程才能完整地删除文件和释放磁盘空间。 参考技术A linux系统里面,如果一个文件被一个进程打开,另外进程删除该文件并不会释放该文件的储存空间。 当所有打开这个文件的进程关闭该文件后,就会删除。解决方法粗暴一点就是杀掉所有打开该文件的进程。

LINUX删除文件,但空间不释放

1、问题描述:

rm  /tmp/access_log 通过rm删除大文件之后,查看磁盘结果显示磁盘占用依然是100%,空间并没有被释放。



2、解决思路

一般说来不会出现删除文件后空间不释放的情况,但是也存在例外,比如文件被进程锁定,或者有进程一直在向这个文件写数据等等,要理解这个问题,就需要知道Linux下文件的存储机制和存储结构。

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


3、问题排查

既然有了解决问题的思路,那么接下来看看是否有进程一直在向acess.log文件中写数据,这里需要用到Linux下的lsof命令,通过这个命令可以获取一个已经被删除但仍然被应用程序占用的文件列表,命令执行如下图所示:

lsof |grep delete 



从输出结果可以看到,/tmp/acess.log文件被进程httpd锁定,而httpd进程还一直向这个文件写入日志数据,从第七列可知,这个日志文件大小仅70G,而系统根分区总大小才100G,由此可知,这个文件就是导致系统根分区空间耗尽的罪魁祸首,在最后一列的“deleted”状态,说明这个日志文件已经被删除,但由于进程还在一直向此文件写入数据,空间并未释放。


4、解决问题


到这里问题就基本排查清楚了,解决这一类问题的方法有很多种.

最简单的方法是关闭或者重启httpd进程,当然也可以重启操作系统,不过这并不是最好的方法,对待这种进程不停对文件写日志的操作,要释放文件占用的磁盘空间,最好的方法是在线清空这个文件,可以通过如下命令完成:

echo " " >/tmp/acess.log

通过这种方法,磁盘空间不但可以马上释放,也可保障进程继续向文件写入日志,这种方法经常用于在线清理Apache、Tomcat、Nginx等Web服务产生的日志文件。


本文出自 “無言的对白” 博客,请务必保留此出处http://chbinmile.blog.51cto.com/6085145/1872633

以上是关于如何解决Linux系统文件已删除但空间未释放的主要内容,如果未能解决你的问题,请参考以下文章

如何解决Linux文件已经删除但是空间未释放的问题

Linux中大文件日志删除,但空间未被释放-解决方案

linux 文件已删除但空间不释放

linux 删除文件后,如何释放磁盘空间

linux删除文件 空间没有被释放

Linux 删除文件磁盘空间未释放