首页 > 系统相关 >解决linux系统删除文件,但是不释放存储空间问题

解决linux系统删除文件,但是不释放存储空间问题

时间:2024-03-28 17:35:25浏览次数:28  
标签:tmp 文件 释放 删除 占用 linux 空间 存储空间

转自连接:https://blog.csdn.net/qq_29864051/article/details/131337429

Linux下 文件删除但是空间未被释放 或者 磁盘已满但找不到对应的大文件 的解决方案

 

 

Linux下文件删除但是空间未被释放的解决方案
前言
1. 查看当前磁盘占用情况
2. 模拟进程占用
3. 执行rm -rf 命令删除文件
4. 查看被删除但是未释放空间的文件
5. 执行清空文件操作
前言
linux磁盘空间已满,手动rm -rf 删除了大文件之后,df -h 查看一下发现空间占用还是不变,有时候会想rm -rf 删除只是逻辑删除到回收站一样?其实不然,通常这种情况都是文件被删除,但是还被进程占用,因此删除文件空间未释放

通常的建议是kill 掉对应的进程,但是如果是生成环境,不能轻易kill进程的话,可以通过置空文件的方式来释放空间

通过lsof | grep deleted 找到未能删除掉的文件,确定占用的进程号
通过 ls -l /proc/PID/fd/* | grep 文件名,找到相应文件句柄
清除文件内容 echo > /proc/PID/fd/FD_NUM

此操作不会删除文件,而是将文档内容清空的方法释放空间,文件仍存在

1. 查看当前磁盘占用情况
首先查看磁盘占用,然后创建了一个5GB的文件,然后继续查看磁盘占用,可以看到磁盘可用已经减少了5GB

# 查看磁盘占用
df -h
# 创建1个5000MB的文件
dd if=/dev/zero of=/delete.tmp bs=1000MB count=5

 2. 模拟进程占用

这里使用tail -f 命令对文件进行占用

tail -f /delete.tmp

 3. 执行rm -rf 命令删除文件

下图可以看到,由于文件被占用,执行删除命令成功后仍然没有释放空间

# 查看磁盘占用
df -h
# 删除创建文件
rm -f /delete.tmp

# 查看磁盘占用
df -h

 4. 查看被删除但是未释放空间的文件

通过执行以下命令,可以看到tail 进行占用了delete.tmp文件,文件大小5GB

lsof | grep deleted

 5. 执行清空文件操作

语法:

# 通过PID查看文件句柄
ll /proc/PID/fd | grep delete.tmp

# 将指定进程下文件句柄的文件置空
echo > /proc/PID/fd/文件句柄
示例:

# 查看pid为17271的文件句柄
ll /proc/17271/fd | grep delete.tmp

# 置空文件
echo > /proc/17271/fd/3

 -------------------------------分割线---------------------------------------------------

转自:https://www.cnblogs.com/ooo0/p/14911415.html

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服务产生的日志文件。

 

标签:tmp,文件,释放,删除,占用,linux,空间,存储空间
From: https://www.cnblogs.com/yeziwinone/p/18102207

相关文章

  • Linux服务器上安装依赖报错No space left on device
    在安装anaconda到/home/xxx时无法正常安装,根据以下报错信息到网上查询之后发现是内存空间不足导致的,使用df命令查看安装前/home目录下还有4G空间,但是报错后只剩下了60多MB。[53453]Failedtoexecutescript'entry_point'duetounhandledexception!改装miniconda,minico......
  • (55/60)两个字符串的删除操作、编辑距离
    两个字符串的删除操作leetcode:583.两个字符串的删除操作动态规划思路先求最长子序长度然后计算两个原字符串离最长子序长度差多少。代码实现classSolution{public:/*(之前搞错了)最长子序长度word[0:i-1]和word2[0:j-1]的最长子序长dp[i][j]if(word1[i-1]==wo......
  • Linux修改时间
    服务器时间与网络时间不符:一、手动修改date命令:查看当前时间date-s时分秒:修改时间还需要把日期改过来3.date-s完整日期时间(YYYY-MM-DDhh:mm[:ss]):修改日期、时间时间要用双引号括起来,否则报错手动修改会存在一定的时间误差4.hwclock-w将时间写入bio......
  • //练习二:删除一个多级文件夹
    publicclassTest07{publicstaticvoidmain(String[]args){Filesrc=newFile("F:\\test\\apple\\src");deleteSrc(src);}privatestaticvoiddeleteSrc(Filesrc){/**先删除这个文件夹里面所有的内容......
  • 北京理工大学操作系统 实验一 编译Linux内核
    实验一编译Linux内核实验一编译Linux内核一、实验目的二、实验内容三、实验步骤1.安装虚拟机并配置环境实验环境:2.下载并解压Linux内核源码3.配置内核编译选项4.编译并安装内核和模块5.修改GRUB配置四、实验结果及分析五、实验收获与体会Copyright©2024Squar......
  • linux虚拟机没有ip,网卡服务无法启动的解决
    最近使用虚拟机做实验,挂起虚拟机后再回复,发现经常无法使用xshell连接。进入虚拟机后,使用ifconfig命令查看网卡状态,发现网卡的ip没有了[root@host103~]#ifconfigens33      重启网卡,发现报错。查看网卡目录,也就只有这一个网卡文件,也就是不存在其他网卡配置错......
  • Linux系统通过firewall限制或开放IP及端口
    一、查看防火墙状态1、首先查看防火墙是否开启,如未开启,需要先开启防火墙并作开机自启systemctlstatusfirewalld开启防火墙并设置开机自启systemctlstartfirewalldsystemctlenablefirewalld一般需要重启一下机器,不然后面做的设置可能不会生效二、开放或限制端口1、开放端......
  • 列举和删除.NET的版本
    删除前dotnet--list-sdksdotnet--list-runtimesdotnet--info从工具的发布页面下载.NET卸载工具仅删除标记为预览版的.NETSDK(最高预览版除外)。dotnet-core-uninstallremove--all-previews-but-latest--sdk因为没有符合条件的,所有并未产生删除。......
  • Linux centos7离线搭建FTP
    1、下载、安装ftp下载ftp安装包,可以从rpm下载站搜索合适的版本,使用wget命令下载。wgethttps://mirrors.aliyun.com/centos/7/os/x86_64/Packages/vsftpd-3.0.2-28.el7.x86_64.rpm安装:rpm-ivhvsftpd-3.0.2-28.el7.x86_64.rpm2、配置ftp2.1、创建用户、授权目录#创建......
  • Linux基础命令
    包含日常开发能用到的大部分Linux命令Linux的目录结构/,根目录是最顶级的目录了Linux只有一个顶级目录:/路径描述的层次关系同样适用/来表示/home/itheima/a.txt,表示根目录下的home文件夹内有itheima文件夹,内有a.txtls命令功能:列出文件夹信息语法:ls[-l-h-a][参数]......