rm 删除文件后磁盘依然占用

本文介绍了lsof命令的功能及应用场景,包括查看进程打开的文件、端口等信息,特别适用于找回已删除但未释放磁盘空间的大文件,提供了解决磁盘空间占用率异常的步骤。

lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行。

在linux环境下,任何事物都以文件的形式存在,通过文件不仅仅可以访问常规数据,还可以访问网络连接和硬件。所以如传输控制协议 (TCP) 和用户数据报协议 (UDP) 套接字等,系统在后台都为该应用程序分配了一个文件描述符,无论这个文件的本质如何,该文件描述符为应用程序与基础操作系统之间的交互提供了通用接口。因为应用程序打开文件的描述符列表提供了大量关于这个应用程序本身的信息,因此通过lsof工具能够查看这个列表对系统监测以及排错将是很有帮助的。

 

在Linux中,当我们使用rm在linux上删除了大文件,但是如果有进程打开了这个大文件,却没有关闭这个文件的句柄,那么linux内核还是不会释放这个文件的磁盘空间,最后造成磁盘空间占用100%,整个系统无法正常运行。这种情况下,通过df和du命令查找的磁盘空间,两者是无法匹配的,可能df显示磁盘100%,而du查找目录的磁盘容量占用却很小。

遇到这种情况,基本可以断定是某些大文件被某些程序占用了,并且这些大文件已经被删除了,但是对应的文件句柄没有被某些程序关闭,造成内核无法收回这些文件占用的空间。

lsof 
command     PID USER   FD      type             DEVICE     SIZE       NODE NAME
init          1 root  cwd       DIR                8,2     4096          2 /
init          1 root  rtd       DIR                8,2     4096          2 /
init          1 root  txt       REG                8,2    43496    6121706 /sbin/init
init          1 root  mem       REG                8,2   143600    7823908 /lib64/ld-2.5.so
init          1 root  mem       REG                8,2  1722304    7823915 /lib64/libc-2.5.so
init          1 root  mem       REG                8,2    23360    7823919 /lib64/libdl-2.5.so

选项:

-a:列出打开文件存在的进程;
-c<进程名>:列出指定进程所打开的文件;
-g:列出GID号进程详情;
-d<文件号>:列出占用该文件号的进程;
+d<目录>:列出目录下被打开的文件;
+D<目录>:递归列出目录下被打开的文件;
-n<目录>:列出使用NFS的文件;
-i<条件>:列出符合条件的进程。(4、6、协议、:端口、 @ip )
-p<进程号>:列出指定进程号所打开的文件;
-u:列出UID号进程详情;
-h:显示帮助信息;
-v:显示版本信息。

linux里的文件被删除后,空间没有被释放是因为在Linux系统中,通过rm或者文件管理器删除文件将会从文件系统的目录结构上解除链接(unlink).然而如果文件是被打开的(有一个进程正在使用),那么进程将仍然可以读取该文件,磁盘空间也一直被占用。
解决方法:
1、先df -lh查看一下磁盘使用状况
2、找到被删除文件所在的分区,eg.opt分区
3、查看被删除了的所有文件:lsof -n /opt |grep deleted
 结果如下:[root@test app]# lsof -n /opt |grep delete
 sftp-serv  8195      root    5r   REG  104,6 8214888448 786452 /opt/software/resin-pro-3.1.10/log/jvm-app-a.log (deleted)
4、kill 8195
5、再运行lsof -n /opt |grep delete,应该没上面的结果了。
6、再运行df -lh看是不是空间已经释放了

<think>首先,用户的问题是关于Ubuntu系统中删除文件磁盘空间未恢复的解决方案。我需要参考提供的引用内容来提取相关信息。 回顾提供的引用: - 引用[1]:描述了因磁盘占满导致Ubuntu无法启动,进入recovery mode删除文件的方法。 - 引用[2]:提到Ubuntu中磁盘空间被错误日志占满,删除日志文件后解决问题。 - 引用[3]:Mac上Ubuntu虚拟机磁盘空间不足导致无法启动,进入恢复模式。 - 引用[4]:Ubuntu桌面版磁盘满了进不去系统,编辑内核启动参数进入救援模式。 - 引用[5]:虚拟机Ubuntu打不开,进入recovery mode删除文件。 用户的具体问题是:删除文件磁盘空间未恢复。这意味着用户已经删除文件,但df命令显示空间没有被释放。 从系统知识来看,这可能是因为文件删除但仍被某个进程打开。在Linux中,如果一个文件删除但仍然被进程占用磁盘空间只有当进程关闭文件时才会释放。 参考引用内容,我可以提取相关点: - 引用[1]中提到使用df -h和du命令查看磁盘使用情况。 - 引用[5]中也提到了df -hl和du -hl来查看文件夹大小。 - 没有直接提到删除文件后空间未恢复的问题,但提供了进入recovery mode等方法。 我需要基于系统知识来回答。可能的解决方案包括: 1. 检查是否有进程占用删除文件:使用lsof命令来查找哪些进程还在使用已删除文件。 例如:`lsof | grep deleted` – 这会显示被删除但未释放的文件。 2. 重启服务或系统:重启可能释放被占用文件。 3. 清理其他空间:可能是其他文件占用,用户误以为删除文件没有被释放。 4. 检查挂载点和目录:确保删除的是正确目录下的文件。 在回答中,我需要结构化,如系统指令要求:清晰、中文、生成相关问题。 回答结构: - 先解释原因:删除文件后空间未恢复通常是因为文件被进程占用。 - 然后提供解决方案步骤。 - 引用相关引用内容来支持。 引用标识:在末尾添加引用标识,如[^1]。 生成相关问题:在最后添加相关问题。 系统指令要求: - 行内数学表达式用$...$,但这个问题可能不需要数学表达式。 - 独立公式用$$...$$,同样可能不需要。 - LaTeX语法正确。 - 中文回答。 - 生成相关问题。 最终回答框架: 1. **解释问题原因**:简要说明为什么删除文件磁盘空间未恢复。 2. **解决方案步骤**:详细列出步骤,包括命令示例。 - 例如:检查占用进程、重启服务、手动释放等。 3. **参考引用**:自然地融入引用内容。例如,提及进入recovery mode的方法从引用[1]或[5]。 4. **生成相关问题**:在末尾添加2-3个相关问题。 相关问题建议: 1. 如何防止文件占用导致空间未释放? 2. Ubuntu中磁盘空间不足的其他常见原因和解决方案? 3. 如何监控Ubuntu系统的磁盘使用情况? 确保回答可靠:基于Linux常识。 </think>### Ubuntu系统删除文件磁盘空间未恢复的解决方案 在Ubuntu系统中,删除文件磁盘空间未被释放是一个常见问题,通常发生在文件删除但仍被某个进程占用时(例如,后台运行的服务或应用程序持有文件句柄)。这会导致`df`命令显示空间未恢复,而`du`命令可能显示实际目录大小已减小。以下是基于系统知识的详细解决步骤,参考了您提供的引用内容(如进入恢复模式的操作)。解决过程需要终端操作,建议以root权限执行。 #### 原因分析 - **核心问题**:删除文件可能被进程锁定,磁盘空间仅在该进程关闭文件句柄后才会释放(Linux文件系统机制)。 - **其他可能**:删除文件在回收站未清空、文件系统错误或日志文件快速生成(如引用[2]中提到的错误日志占满空间)。 - 确认步骤:首先运行`df -h`检查磁盘整体使用情况,再用`du -sh /path/to/directory`确认目录大小变化(引用[1][5])。 #### 解决方案步骤 按照以下顺序操作,逐步排查和解决问题。如果系统无法正常启动,请参考引用[1][3][4][5]的方法进入恢复模式(Recovery Mode)。 1. **检查并释放被占用文件** - **查找占用进程**:使用`lsof`命令识别哪些进程仍持有已删除文件的句柄。 ```bash lsof | grep deleted # 列出所有被删除但未释放的文件及其进程ID ``` 输出示例: ``` java 1234 user 1w REG 8,1 10485760 123456 /var/log/app.log (deleted) ``` - **释放空间**: - **终止进程**:如果进程不是关键服务,终止它以释放空间。 ```bash kill -9 <PID> # 替换<PID>为上一步查到的进程ID ``` - **重启相关服务**:如果进程是系统服务(如cups日志服务,引用[2]),重启服务。 ```bash sudo systemctl restart <service-name> # 例如 sudo systemctl restart cups ``` - **强制释放**:如果无法终止进程,可尝试重启系统(`sudo reboot`),这会关闭所有进程并释放空间。 2. **清理回收站和临时文件** - 删除文件可能在用户回收站中残留。清空回收站: ```bash rm -rf $HOME/.local/share/Trash/files/* # 清空当前用户回收站(引用[2]) ``` - 清除系统临时文件: ```bash sudo rm -rf /tmp/* # 删除/tmp目录下所有临时文件 ``` 3. **检查文件系统错误** - 磁盘空间未恢复可能是文件系统错误导致。运行fsck检查: ```bash sudo umount / # 先卸载根分区(需在恢复模式下操作) sudo fsck -y /dev/sda1 # 替换sda1为您的根分区设备名(使用df -h查看) ``` 完成后重启系统。 4. **预防性维护** - **监控磁盘空间**:定期使用`df -h`和`du -sh * | sort -h`监控目录大小(引用[1][5])。 - **限制日志文件**:对于频繁生成的日志(如引用[2]中的cups错误日志),配置日志轮转: ```bash sudo nano /etc/logrotate.conf # 编辑配置文件,增加大小限制 ``` #### 注意事项 - **恢复模式使用**:如果系统无法启动,参考引用[1][3][4][5],开机时选择"Advanced options for Ubuntu" > "Recovery Mode" > "root",然后执行上述命令。 - **风险提示**:删除文件前,确认不会影响系统稳定性(如避免删除核心文件)。使用`rm -rf`时格外谨慎(引用[1][5])。 - **效果验证**:操作后运行`df -h`确认空间恢复。如果问题依旧,考虑磁盘损坏或虚拟机存储问题(引用[3])。 通过以上步骤,大多数情况下磁盘空间能成功释放。如果问题持续,建议检查硬件或虚拟机配置[^1][^2][^3][^4][^5]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值