Linux如何处理文件已删除但空间不释放的问题

问题产生背景

一个业务系统的服务器监控系统发来预警通知,磁盘空间使用率已经达到90%了,然后就登陆服务器搜索了下比较大的日志文件,全部都删除了(坑在此处埋上了),磁盘空间释放了一些,当时也是疏忽,没有确认查出并删除的文件大小的空间是否已经全部释放。没过几天,服务器又被预警了,比较纳闷,日志怎么增长的这么快,排查之后发现,原来是上次操作删除文件后,有个较大的文件空间没有释放导致的。

问题还原及解决办法

找到占用空间较大的数据文件

#查看磁盘空间使用情况
$ df -h
#先查询/tmp目录下占用空间较大的文件
$ du -sh /tmp/*|sort -nr|head -3
#在查询/home目录下占用空间较大的文件
$ du -sh /home/*|sort -nr|head -3
# 找到文件后,进行删除即可,删除后,使用 df -h进行查看是否已经释放

说明下为啥在找文件的时候,先找了/tmp/*目录下的文件

Linux系统删除策略:Linux没有回收站功能,所以服务去会将要删除的文件都会先移动到系统/tmp目录下,然后定期清除/tmp目录下的数据。

有好多服务器在安装系统的时候没有给/tmp进行单独分区,所以有可能是/tmp目录下的数据占用了很大一部分空间,可以先清除掉/tmp目录下的文件来释放空间。

本次出现删除文件不释放空间,是在删除/home目录空间下的一个dubbo服务日志文件时发生的。

删除文件不释放空间原因

一般情况下不会出现删除文件后空间不释放的情况,但在这个文件被进程锁住或者是有进程一直往这个文件写数据等情况下,还是会出现的。了解Linux下文件的存储机制和存储结构的原理就会理解这个问题了。

文件存在Linux系统中分为两部分:指针部分和数据部分。

  • 指针部分:存在文件系统的meta-data中,我们执行rm命令将数据删除后,这个指针就从meta-data中被清除掉了。
  • 数据部分:数据就是直接存储在磁盘上了,当指针被从meta-data中清除后,数据部分占用的空间就可以被覆盖并写入新的内容。

之所以出现删除dubbo日志文件后,空间还不释放,就是由于dubbo进程还在一直往这个文件里面写数据,在删除文件的时候,指针并没有被从meta-data中清除掉,所以日志文件还是占用着空间。

如何找到此类文件

可以通过lsof命令获取已经删除但是还被程序占用的文件列表:

lsof | grep delete

如何释放此类空间

解决这一类问题释放空间的方法有很多种:重启占用的进程、重启操作系统、通过命令。非生产环境采用前两种方式最方便了,但是对于生产环境,还是尽量采用命令的方式,其实命令也很简单:

echo " " >/home/dubbo/log/xxx.log

通过这种方式,会里面释放掉占用的磁盘空间,也不影响进程继续执行。

到此这篇关于Linux如何处理文件已删除但空间不释放的问题的文章就介绍到这了,更多相关Linux 文件删除空间不释放内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • linux下mysql自动备份数据库与自动删除临时文件

    一.每日23:00自动删除临时文件 首先查看一下crontab的任务列表:crontab -l然后新建:crontab -e添加一行:00 03 * * * rm -rf /www/cmstest/my120/public/scripts/jpgraph/*保存退出.重启服务:  /etc/rc.d/init.d/crond restart 二.每日24:00自动备份数据库 利用系统crontab来定时执行备份文件,按日期对备份结果进行保存,达到备份的目的. 1.创建保存备份文件的路径/mysq

  • Linux 删除文件夹和文件的命令(强制删除包括非空文件)

    linux删除目录很简单,很多人还是习惯用rmdir,不过一旦目录非空,就陷入深深的苦恼之中,现在使用rm -rf命令即可. 直接rm就可以了,不过要加两个参数-rf 即:rm -rf 目录名字 -r 就是向下递归,不管有多少级目录,一并删除 -f 就是直接强行删除,不作任何提示的意思 1.删除文件夹实例: rm -rf /var/log/httpd/access 将会删除/var/log/httpd/access目录以及其下所有文件.文件夹 2.删除文件使用实例: rm -f /var/log

  • linux删除大量文件的6种方法

    首先建立50万个文件 复制代码 代码如下: test  for i in $(seq 1 500000)for> dofor> echo test >>$i.txtfor> done 1 rm 复制代码 代码如下: test  time rm -f *zsh: sure you want to delete all the files in /home/hungerr/test [yn]? yzsh: argument list too long: rmrm -f *  3.

  • Linux系统删除文件夹和文件的命令

    linux删除目录很简单,很多人还是习惯用rmdir,不过一旦目录非空,就陷入深深的苦恼之中,现在使用rm -rf命令即可. 直接rm就可以了,不过要加两个参数-rf 即:rm -rf 目录名字 -r 就是向下递归,不管有多少级目录,一并删除 -f 就是直接强行删除,不作任何提示的意思 删除文件夹实例: rm -rf /var/log/httpd/access 将会删除/var/log/httpd/access目录以及其下所有文件.文件夹 删除文件使用实例: rm -f /var/log/htt

  • Linux 中清空或删除大文件内容的五种方法

    在 Linux 终端下处理文件时,有时我们想直接清空文件的内容但又不必使用任何Linux命令行编辑器 去打开这些文件.那怎样才能达到这个目的呢?在这篇文章中,我们将介绍几种借助一些实用的命令来清空文件内容的方法. 注意: 由于再Linux中一切皆文件,你需要时刻注意,确保你将要清空的文件不是重要的用户文件或者系统文件.清空重要的系统文件或者配置文件可能会引发严重的应用失败或者系统错误. 提示:在下面的示例中,我们将使用名为 access.log 的文件来作为示例样本. 1. 通过重定向到 Nul

  • linux实现除了某个文件或某个文件夹以外的全部删除

    比如一个目录下有1,2,3,4,5这五个文件,现在我需要删除除了2以外的所有文件,那么我可以使用 find . ! -name 2 -exec rm -f {} \; 当然你还可以配合着 -maxdepth 来更精准的删除了. 下面演示删除的范围仅限于当前目录. find . -maxdepth 1 ! -name 2 -exec rm -f {} \; 下面提供Linux下find命令的详细使用方法 在目录结构中搜索文件,并执行指定的操作.此命令提供了相当多的查找条件,功能很强大. 语法:fi

  • linux 不删除文件,清空文件中内容的命令

    在某些时候,需要清空文件内容,而不删除文件.比喻有些日志文件(log.txt):在linux下的命令为:true >log.txt 测试结果: touch log.txt →#新建文件log.txt vi log.txt →#编辑文件 随便输入什么东西 :wq!回车 →#保存退出: cat log.txt →#查看 文件内容: true >log.txt →#查看文件里面的内容: 附: rm -r 删除目录,不管目录中有没有文件 rm -rf 强制删除,没有提示 一般用到的就这两个,删除文件可

  • 详解在Linux中清空或删除大文件内容的5种方法

    有时,在处理Linux终端中的文件时,您可能希望清除文件的内容,而无需使用任何Linux命令行编辑器打开它.怎么能实现这一目标?在本文中,我们将借助一些有用的命令,通过几种不同的方式清空文件内容. 警告:在我们继续查看各种方法之前,请注意,因为在Linux中一切都是文件,所以必须始终确保要清空的文件不是重要的用户或系统文件.清除关键系统或配置文件的内容可能会导致致命的应用程序/系统错误或故障. 就像刚刚说的,下面是从命令行清除文件内容的方法. 重要说明:出于本文的目的,我们access.log在

  • Linux下正确快速删除海量文件的方法分享

    前言 注意本文说的"海量"并不是指体积大,而是指数量,比如一个目录下有数百万个小文件. 最近在优化服务器时发现postfix下的maildrop目录和clientmqueue目录下发现有大量的文件,进入这些目录里使用ls命令是愚蠢的做法,而直接执行rm * , 没有任何反应,文件数量也没有减少,也就是说,在海量文件目录里直接使用rm命令进行删除是无效的. 那么正确的方法是什么呢?有两种方法可选: 第一种: find /path/to/directory -type f -exec rm

  • Linux中删除文件内空行的4种方法

    在Linux上处理一些数据文件时,有时候需要将其中的空行过滤掉,系统中提供的各种工具都可以完成这个功能.将常用的介绍如下吧:1. grep 复制代码 代码如下: grep . data.txtgrep -v '^$' data.txtgrep '[^$]' data.txt 2. sed 复制代码 代码如下: sed  '/^$/d' data.txtsed '/^\s*$/d' data.txt   #这个命令还可将完全空格.tab等组成的空行删掉.# The character class

随机推荐