帮助中心 > 博文

Linux删除文件,空间没有释放

更新时间:2020-12-24


问题现象

Linux操作系统云服务器根目录空间占用率过高。例如,以图为例,根目录空间占用率为96%。


根目录空间占用率过高




查询当前系统存在一个约42G 大小的文件access_log,这个文件应该是apache产生的访问日志文件,从日志大小来看,应该是很久没有清理的apache 日志文件了。

执行以下命令删除access_log。
rm /tmp/access_log
执行以下命令查看文件系统使用率。
df -h


删除该文件后使用df查看文件系统使用率率仍是96%。


根因分析

通常不会出现删除文件后空间不释放的情况,但是也存在例外,比如文件进程锁定,或者有进程一直在向这个文件写数据,要明白这个问题,首先需要知道 linux 下文件的存储机制和存储结构。


一个文件在文件系统中存放分为两个部分:


1.指针部分:指针位于文件系统的meta-data中,在将数据删除后,这个指针就从meta-data中清除了。


2.数据部分:而数据部分存储在磁盘中。


将数据对应的指针从meta-data中清除后,文件数据部分占用的空间就可以被覆盖并写入新的内容。之所以出现删除access_log文件后,空间还没有释放,就是因为httpd进程还在一直向这个文件写入内容,导致虽然删除了access_log文件,但是由于进程锁定,文件对应的指针部分并未从meta-data中清除,而由于指针并未删除,系统内核就默认文件并未被删除,因此查询文件系统使用率时,显示空间并未释放。


处理方法

1.使用lsof命令查看是否有进程一直在向 access_log 文件中写入数据。


lsof -n |grep delete


从输出可以看出,/tmp/access_log 文件被进程 httpd 锁定,而 httpd 进程还一直向这个文件写入日志数据,最后一列的‘deleted’状态说明这个日志文件已经被删除,但是由于进程还在一直向此文件写入数据,因此空间并未释放。 框内就是我们要找的进程


执行命令


kill -9 2660

杀死进程 再看空间已经释放了,收工


2.可以选择关闭或者重启httpd进程,或重启操作系统。推荐在线清空access_log。执行以下命令清空access_log。


echo "">/access_log

通过这种方法,磁盘空间不但可以马上释放,也可以保证进程继续向文件写入日志,再次执行df -h查看根分区空间已经释放。




3.新建一个空文件(谨慎操作)


echo "">access_log

创建一个access_log 文件,会替换原本的文件
其中 ,“>”和“>>”分别是将标准输出导向一个文件或追加到一个文件中。
“>” :相当于清空源文件内容,重新写入新的内容。
“>>” :相当于保留源文件内容,在最后一行追加内容。


总结

找出占用大量空间的文件的命令


du -sh \*

用于分析当前目录下所有目录、文件分别占用空间的大小
找出占用删除文件的进程


lsof |grep deleted
找到占用删除文件的进程,在找不到有大文件占用空间但空间确实被占满时有奇效


转载请注明出处: https://www.eaysun.cn
更多问题