linux解决文件已删除空间不释放的问题及原因分析

1、错误现象
运维的监控系统发来通知,报告一台服务器空间满了,登录服务器查看,根分区确实没有空间了:
[root@localhost ~]# df -h
这里首先说明一下服务器的一些删除策略,由于linux没有回收站功能,所以线上服务器上所有要删除的文件都会先移动到系统/tmp目录下,然后定期清除/tmp目录下的数据。这个策略本身没有问题,但是通过检查发现这台服务器的系统分区中并没有单独划分/tmp分区,这样/tmp下的数据其实占用了根分区的空间。既然找到了问题,那么删除/tmp目录下一些占空间较大的数据文件即可,检查/tmp下最大的三个数据文件。
[root@localhost ~]# du -sh /tmp/*|sort -nr|head -3。
通过命令输出发现在/tmp目录下有个66gb大小的文件access_log,这个文件应该是apache产生的访问日志文件,从日志大小来看,应该是很久没有清理apache日志文件了,基本判定是这个文件导致的根空间爆满,在确认此文件可以删除后,执行如下删除操作:
[root@localhost ~]# rm /tmp/access_log
接着查看系统根分区空间是否释放:
[root@localhost ~]# df -h
从输出可以看到,根分区空间仍然没有释放,这是怎么回事。
2、解决思路
一般来说不会出现删除文件后空间不释放的情况,但是也存在例外,比如文件被进程锁定,或者有进程一直在向这个文件写数据等,要理解这个问题,就需要知道linux下文件的存储机制和存储结构。
一个文件在文件系统中的存放分为两个部分:数据部分和指针部分,指针位于文件系统的meta-data中,在将数据删除后,这个指针就从meta-data中清除了,而数据部分存储在磁盘中。在将数据对应的指针从meta-data中清除后,文件数据部分占用的空间就可以被覆盖并写入新的内容,之所以在出现删除access_log文件后,空间还没释放,就是因为httpd进程还在一直向这个文件写入内容,导致虽然删除了access_log文件,但是由于进程锁定,文件对应的指针部分并未从meta-data中清除,而由于指针并未删除,系统内核就认为文件并未删除,因此通过df命令查询空间并未释放也就不足为奇了。
3、问题排查
既然有了解决问题的思路,那么接下来看看是否有进程一直在向access_log文件中写数据,这里需要用到linux下的lsof命令,通过这个命令可以获取一个仍然被应用程序占用的已删除文件列表,命令执行如下:
[root@localhost ~]# lsof | grep delete
从输出结果可以看到,/tmp/access_log文件被进程httpd锁定,而httpd进程还一直向这个文件写入日志数据。从第7列可知,这个日志文件大小约70gb,而系统根分区总大小才100gb,由此可知,这个文件就是导致系统根分区空间耗尽的罪魁祸首。最后一列的“deleted”状态说明这个日志文件已经被删除,但由于进程还在一直向此文件写入数据,因此空间并未释放。
4、解决问题
到这里问题就基本排查清楚了,解决这一类问题的方法有很多种,最简单的方法是关闭或重启httpd进程,当然也可以重启操作系统,不过这些并不是最好的方法。对待这种进程不停对文件写日志的操作,要释放文件占用的磁盘空间,最好的方法是在线清空这个文件,具体可以通过如下命令完成:
[root@localhost ~]# echo " " >/tmp/acess.log
通过这种方法,磁盘空间不但可以马上释放,也可保障进程继续向文件写入日志,这种方法经常用于在线清理apache、tomcat、nginx等web服务产生的日志文件。
5、原因分析原因是因为已经删除的文件仍然被某个进程占用,所以导致磁盘空间得不到释放,必须要kill进程之后,空间才会被释放。

#原因:已经删除的文件仍然被某个进程占用,所以导致磁盘空间得不到释放。
lsof |grep -i delete
# kill掉占用已删除文件的进程后,空间被释放。
kill -9 {pid}
# tips
# 提示lsof command not found,执行安装。
yum install lsof
注意:删除正在写的文件一般用 cat /dev/null >file,而不是直接rm(直接rm会造成文件删除空间不释放的问题)。
如果此时磁盘空间已被占满,无法安装两种方式。
删除其他没有被任何进程占用的文件,获得一部分空间供安装lsof
如果空间已被之前的删除文件占满,方式1无法解决,只能回忆可能是哪个进程占用了那个文件,手动kill
元问答
本文链接:linux解决文件已删除空间不释放的问题 _ 其它 _ 生活杂谈

  • 23
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值