首页 > 其他 > 详细

解决文件删除后空间不释放的问题

时间:2021-05-31 15:56:12      阅读:17      评论:0      收藏:0      [点我收藏+]

1、错误现象

某分区没有剩余空间,找到较大文件删除后,空间没有被释放:

[root@localhost ~]# df -h

[root@localhost ~]# du -sh /tmp/*|sort -nr|head -3

通过命令输出发现在/xxx目录下有个xxxGB大小的文件xxx_log,这个文件应该是xxx产生的访问日志文件,从日志大小来看,应该是很久没有清理的日志文件了,基本判定是这个文件导致的空间爆满,在确认此文件可以删除后,执行如下删除操作:

[root@localhost~]# rm /xxx/xxx_log

接着查看xxx分区空间是否释放:

[root@localhost ~]# df -h

从输出可以看到,xxx分区空间仍然没有释放。

2、解决思路

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

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

3、问题排查

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

[root@localhost ~]# lsof | grep delete

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

4、解决问题

到这里问题就基本排查清楚了,解决这一类问题的方法有很多种,最简单的方法是关闭或重启xxx进程,当然也可以重启操作系统,不过这些并不是最好的方法。对待这种进程不停对文件写日志的操作,要释放文件占用的磁盘空间,最好的方法是在线清空这个文件,具体可以通过如下命令完成:

[root@localhost~]# : > /xxx/xxx_log

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

解决文件删除后空间不释放的问题

原文:https://www.cnblogs.com/sxycloud/p/14831174.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!