linux⽂件已删除但空间不释放
1、错误现象
运维的监控系统发来通知,报告⼀台服务器空间满了,登录服务器查看,根分区确实没有空间了:
[root@localhost ~]# df -h
浙江限电令新规定2021最新消息机场巴士这⾥⾸先说明⼀下服务器的⼀些删除策略,由于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服务产⽣的⽇志⽂件。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论