侧边栏壁纸
博主头像
小续的成长时光 博主等级

行动起来,活在当下

  • 累计撰写 21 篇文章
  • 累计创建 14 个标签
  • 累计收到 3 条评论

目 录CONTENT

文章目录

删除文件但空间不释放问题及其扩展

小续
2024-05-06 / 0 评论 / 1 点赞 / 56 阅读 / 0 字 / 正在检测是否收录...

1、df命令显示磁盘空间不足而du命令显示还有很多空闲空间

Linux系统中,有时会遇到当磁盘容量告警时,使用df命令可以看到磁盘使用率很高,本想使用du命令找出大文件并进行删除时,但发现各个目录文件的大小相加,并没有占满磁盘。如下图所示:

 df -Th
 du -sh / --exclude="proc"

image-ryin.png

使用df命令查看到根(/)目录使用到 33G,而du命令显示只使用了 2.5G

1.1、关于df与du命令

首先了解一下两个命令的不同之处,df主要用于查看整个文件系统的磁盘空间占用情况,而du则用于查看文件和目录的磁盘使用空间。

df命令: 显示的是文件系统级别的磁盘空间使用情况,包括已用空间、可用空间以及挂载点等信息。通过df命令,可以得知各个分区的总空间、已用空间和剩余空间,从而了解磁盘的使用状况。

du命令: du更侧重于展示文件和目录级别的磁盘占用情况,只计算文件或目录占用的磁盘空间。这个命令通常用来查找占用空间大的文件或者目录,帮助我们定位可能的磁盘空间浪费问题。

1.2、问题原因

因为虽然文件已被删除,使用ls命令无法找到,但是如果有进程占用该文件时,磁盘空间并不会得到释放。正因为如此,使用df命令查看磁盘使用率时,这些已删除未释放的文件会被统计到,而du只统计未删除的文件,从而导致两者的结果相关较大。

1.3、处理方法

使用 lsof 命令可以显示已删除的文件,将有问题的进程/服务重启,磁盘空间就会得到释放。

如果没有lsof命令,则进行安装。

 yum install lsof -y

1.3.1、查看已删除但未释放的文件

 lsof | grep delete

image-vkpf.png

此时可以看到/var/log/test.log文件已经删除,但还在被tail命令占用,占用文件的进程ID可以看到是4163;

在使用ls命令时,已经查看不到该文件了:

 ls -l /var/log/test.log

image-ontf.png

根据进程ID也可以看到该文件:

 lsof -p 4163

image-mscb.png

1.3.2、关闭进程并验证

 kill 4163

image-omrm.png

将异常进程关闭后,使用df命令查看磁盘空间时显示结果正常。

注意:这里需要自行判断是否为异常进程,以及了解进程被关闭后如何启动。

1.4、小技巧

 # 有时我们并不希望停止对应进程,又想清空该文件(在清理较大的日志文件时比较使用),这时可以使用以下命令
 echo "" > {{file}}
 
 # 注意,以上命令会清空对应文件,执行前确认好是否要清空,或做好备份

2、扩展:Linux 中正在使用的文件被误删除如何恢复

 lsof -a /data/test.txt   #通过lsof -a 查看到less 在使用这个文件

image-rscy.png

  lsof |grep delete  #lsof 可以查看到所有正在运行的进程,grep 过滤出删除的delete。

image-yrio.png

 # 记住进程编号 “9903”
 
 ll /proc/9903/fd**  #fd文件描述符,9903进程编号

image-jfug.png

 cat /proc/9903/fd/4  #可以查看到被删除的文件
 
 cat /proc/9903/fd/4 > /data/test.txt  #把看到的文件替换复制到/data/下的test.txt里
1

评论区