Linux下删除文件之后空间不释放问题

你是否碰见过 Linux 环境下,文件已经删除,但是空间未被释放的情况,本篇文章重点为大家讲解一下关于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服务产生的日志文件。

原创文章,作者:晴川运维,如若转载,请注明出处:https://baike.qcidc.com/13947.html

(0)
晴川运维晴川运维
上一篇 2025年9月24日
下一篇 2025年9月24日

相关推荐

  • Docker搭建本地仓库具体方法

    和Mavan的管理一样,Docker不仅提供了一个中央仓库,同时也允许我们使用registry搭建本地私有仓库,下面为大家详细讲解一下Docker搭建本地仓库具体方法。 一,本地安…

    Linux系统 2025年10月26日
  • 详解Linux中重定向和管道

    对shell有一定了解的人都知道,管道和重定向是 Linux 中非常实用的 IPC 机制。在shell中,我们通常使用符合‘|’来表示管道,符号‘>’和‘ 重定向 系统设定的…

    Linux系统 2025年7月2日
  • 详解Shell 软件—Zsh

    Zsh 是一款功能强大的 Shell 软件,既可以作为交互式终端来使用,也可以作为脚本语言解释器来使用。它在兼容 POSIX 的 sh 的同时(默认不兼容,仅在使用 emulate…

    Linux系统 2025年7月5日
  • tomcat 性能优化

    tomcat默认参数是为开发环境制定,而非适合生产环境,尤其是内存和线程的配置,默认都很低,容易成为性能瓶颈,本篇文章重点为大家讲解一下tomcat 性能优化。 Tomcat连接器…

    Linux系统 2025年10月6日
  • 细说Linux新建用户和组具体方法

    Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统用户的账号一方面可以帮助系统管理员对使…

    Linux系统 2025年10月26日
  • Elasticsearch中Head插件具体使用方法

    elasticsearch-head是一个elasticsearch的集群管理工具,它是完全由html5编写的独立网页程序,你可以通过插件把它集成到es,下面为大家分享一下Elas…

    Linux系统 2025年10月27日
  • 学生党如何保护自己的网络安全

    互联网的兴起给人们的教育带来了巨大的好处。但是,这也使人们成为黑客和敏感信息盗窃的目标,这就是为什么每个学生都必须在某个时候了解在线网络安全的原因。 如今,几乎每个学生都拥有一台智…

    Linux系统 2025年6月25日
  • OpenSSL 在 Apache 和 Dovecot 下的使用(二)

    本篇中,Carla Schroder 会解释如何使用 OpenSSL 保护你的 Postfix/Dovecot 邮件服务器 在上周,作为我们 OpenSSL 系列的一部分,我们学习…

    Linux系统 2025年7月3日
  • 数据中心备用电源系统助解决停机问题

    由于现在企业必须提供更高水平的正常运行时间,企业都开始关注数据中心备用电源。备用电源也越来越先进,管理员可以使用多种系统类型和行业标准来确保无故障运行。 根据研究机构Researc…

    Linux系统 2025年6月9日
  • 对你的Linux进行冻结或锁定

    冻结终端窗口并锁定屏幕意味着什么 – 以及如何在 Linux 系统上管理这些活动。 如何在 Linux 系统上冻结和“解冻”屏幕,很大程度上取决于这些术语的含义。有时“冻结屏幕”可…

    Linux系统 2025年6月28日

发表回复

登录后才能评论