Linux文件已删除,引用未释放(deleted)

博客围绕磁盘警告满但仍有大量可用空间的问题展开。通过指令发现系统存在文件已删但句柄未释放的情况,原因是有线程引用句柄。给出两种解决方案,因业务需实时服务,选择将文件句柄内容置空,不过可能导致错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题描述:

警告文件磁盘已经满了,通过:df -h, du -sh * 等指令配合使用,发现当前系统任然存在大量可以使用的空间。大量剩余的磁盘空间不清楚怎么丢失了…


问题重现:

通过指令:lsof | grep deleted 指令,查看当前系统句柄未释放情况

[root@bigdata-hadoop2:/proc/21893/fd]# lsof | grep deleted
zabbix_ag  1791        zabbix    3wW     REG              253,1         4     132502 /var/tmp/zabbix_agentd.pid (deleted)
zabbix_ag  1806        zabbix    3w      REG              253,1         4     132502 /var/tmp/zabbix_agentd.pid (deleted)
zabbix_ag  1807        zabbix    3w      REG              253,1         4     132502 /var/tmp/zabbix_agentd.pid (deleted)
zabbix_ag  1808        zabbix    3w      REG              253,1         4     132502 /var/tmp/zabbix_agentd.pid (deleted)
python     3946          root   14w      REG              253,1         0     393228 /tmp/cmflistener-stderr---agent-3916-1532518455-HYSskK.log (deleted)
catalogd  21893        impala  254r      REG              253,1 163923099     393230 /tmp/225e43c3-03a8-4b24-ba2e-14637e4d5bba.jar (deleted)
catalogd  21893        impala  255r      REG              253,1  77023830     396109 /tmp/ee702167-27f2-4685-8217-8cec85f53a3c.jar (deleted)
catalogd  21893        impala  258r      REG              253,1  72198042     393231 /tmp/2aeb7bb8-5bed-402d-9201-5c23859754d3.jar (deleted)
catalogd  21893        impala  259r      REG              253,1  72198042     396110 /tmp/9a5ce9d5-fa60-465c-b400-3ea2eeca9a45.jar (deleted)
catalogd  21893        impala  260r      REG              253,1         1     396111 /tmp/fc8ba5b5-ddd8-4317-9e18-bd335584c04f.jar (deleted)
catalogd  21893        impala  262r      REG              253,1 153712947     396112 /tmp/a7378ee0-82cf-4435-b05d-5fbe8248942b.jar (deleted)
catalogd  21893        impala  265r      REG              253,1         1     396113 /tmp/f29f8a20-060f-4286-84e6-b1a958604c8c.jar (deleted)
catalogd  21893        impala  267r      REG              253,1 153714277     396114 /tmp/5fdd988e-fbfa-43ae-a790-c277cab2304b.jar (deleted)
catalogd  21893        impala  269r      REG              253,1         1     396115 /tmp/e37795e5-f53f-49da-8b21-27516241c95f.jar (deleted)
catalogd  21893        impala  270r      REG              253,1         1     396183 /tmp/b0f21624-5850-4c60-b2f4-125656d5ac40.jar (deleted)
catalogd  21893  2502  impala  254r      REG              253,1 163923099     393230 /tmp/225e43c3-03a8-4b24-ba2e-14637e4d5bba.jar (deleted)
catalogd  21893  2502  impala  255r      REG              253,1  77023830     396109 /tmp/ee702167-27f2-4685-8217-8cec85f53a3c.jar (deleted)
catalogd  21893  2502  impala  258r      REG              253,1  72198042     393231 /tmp/2aeb7bb8-5bed-402d-9201-5c23859754d3.jar (deleted)
catalogd  21893  2502  impala  259r      REG              253,1  72198042     396110 /tmp/9a5ce9d5-fa60-465c-b400-3ea2eeca9a45.jar (deleted)
catalogd  21893  2502  impala  260r      REG              253,1         1     396111 /tmp/fc8ba5b5-ddd8-4317-9e18-bd335584c04f.jar (deleted)
catalogd  21893  2502  impala  262r      REG              253,1 153712947     396112 /tmp/a7378ee0-82cf-4435-b05d-5fbe8248942b.jar (deleted)
catalogd  21893  2502  impala  265r      REG              253,1         1     396113 /tmp/f29f8a20-060f-4286-84e6-b1a958604c8c.jar (deleted)
catalogd  21893  2502  impala  267r      REG              253,1 153714277     396114 /tmp/5fdd988e-fbfa-43ae-a790-c277cab2304b.jar (deleted)
catalogd  21893  2502  impala  269r      REG              253,1         1     396115 /tmp/e37795e5-f53f-49da-8b21-27516241c95f.jar (deleted)
catalogd  21893  2502  impala  270r      REG              253,1         1     396183 /tmp/b0f21624-5850-4c60-b2f4-125656d5ac40.jar (deleted)
catalogd  21893  5443  impala  254r      REG              253,1 163923099     393230 /tmp/225e43c3-03a8-4b24-ba2e-14637e4d5bba.jar (deleted)
catalogd  21893  5443  impala  255r      REG              253,1  77023830     396109 /tmp/ee702167-27f2-4685-8217-8cec85f53a3c.jar (deleted)
catalogd  21893  5443  impala  258r      REG              253,1  72198042     393231 /tmp/2aeb7bb8-5bed-402d-9201-5c23859754d3.jar (deleted)
catalogd  21893  5443  impala  259r      REG              253,1  72198042     396110 /tmp/9a5ce9d5-fa60-465c-b400-3ea2eeca9a45.jar (deleted)
catalogd  21893  5443  impala  260r      REG              253,1         1     396111 /tmp/fc8ba5b5-ddd8-4317-9e18-bd335584c04f.jar (deleted)
catalogd  21893  5443  impala  262r      REG              253,1 153712947     396112 /tmp/a7378ee0-82cf-4435-b05d-5fbe8248942b.jar (deleted)
catalogd  21893  5443  impala  265r      REG              253,1         1     396113 /tmp/f29f8a20-060f-4286-84e6-b1a958604c8c.jar (deleted)
catalogd  21893  5443  impala  267r      REG              253,1 153714277     396114 /tmp/5fdd988e-fbfa-43ae-a790-c277cab2304b.jar (deleted)
catalogd  21893  5443  impala  269r      REG              253,1         1     396115 /tmp/e37795e5-f53f-49da-8b21-27516241c95f.jar (deleted)
catalogd  21893  5443  impala  270r      REG              253,1         1     396183 /tmp/b0f21624-5850-4c60-b2f4-125656d5ac40.jar (deleted)
catalogd  21893  5834  impala  254r      REG              253,1 163923099     393230 /tmp/225e43c3-03a8-4b24-ba2e-14637e4d5bba.jar (deleted)
catalogd  21893  5834  impala  255r      REG              253,1  77023830     396109 /tmp/ee702167-27f2-4685-8217-8cec85f53a3c.jar (deleted)
catalogd  21893  5834  impala  258r      REG              253,1  72198042     393231 /tmp/2aeb7bb8-5bed-402d-9201-5c23859754d3.jar (deleted)
catalogd  21893  5834  impala  259r      REG              253,1  72198042     396110 /tmp/9a5ce9d5-fa60-465c-b400-3ea2eeca9a45.jar (deleted)
catalogd  21893  5834  impala  260r      REG              253,1         1     396111 /tmp/fc8ba5b5-ddd8-4317-9e18-bd335584c04f.jar (deleted)
catalogd  21893  5834  impala  262r      REG              253,1 153712947     396112 /tmp/a7378ee0-82cf-4435-b05d-5fbe8248942b.jar (deleted)
catalogd  21893  5834  impala  265r      REG              253,1         1     396113 /tmp/f29f8a20-060f-4286-84e6-b1a958604c8c.jar (deleted)
catalogd  21893  5834  impala  267r      REG              253,1 153714277     396114 /tmp/5fdd988e-fbfa-43ae-a790-c277cab2304b.jar (deleted)
catalogd  21893  5834  impala  269r      REG              253,1         1     396115 /tmp/e37795e5-f53f-49da-8b21-27516241c95f.jar (deleted)
catalogd  21893  5834  impala  270r      REG              253,1         1     396183 /tmp/b0f21624-5850-4c60-b2f4-125656d5ac40.jar (deleted)
catalogd  21893  6688  impala  254r      REG              253,1 163923099     393230 /tmp/225e43c3-03a8-4b24-ba2e-14637e4d5bba.jar (deleted)
catalogd  21893  6688  impala  255r      REG              253,1  77023830     396109 /tmp/ee702167-27f2-4685-8217-8cec85f53a3c.jar (deleted)
catalogd  21893  6688  impala  258r      REG              253,1  72198042     393231 /tmp/2aeb7bb8-5bed-402d-9201-5c23859754d3.jar (deleted)
catalogd  21893  6688  impala  259r      REG              253,1  72198042     396110 /tmp/9a5ce9d5-fa60-465c-b400-3ea2eeca9a45.jar (deleted)
catalogd  21893  6688  impala  260r      REG              253,1         1     396111 /tmp/fc8ba5b5-ddd8-4317-9e18-bd335584c04f.jar (deleted)
catalogd  21893  6688  impala  262r      REG              253,1 153712947     396112 /tmp/a7378ee0-82cf-4435-b05d-5fbe8248942b.jar (deleted)
catalogd  21893  6688  impala  265r      REG              253,1         1     396113 /tmp/f29f8a20-060f-4286-84e6-b1a958604c8c.jar (deleted)
catalogd  21893  6688  impala  267r      REG              253,1 153714277     396114 /tmp/5fdd988e-fbfa-43ae-a790-c277cab2304b.jar (deleted)
catalogd  21893  6688  impala  269r      REG              253,1         1     396115 /tmp/e37795e5-f53f-49da-8b21-27516241c95f.jar (deleted)
catalogd  21893  6688  impala  270r      REG              253,1         1     396183 /tmp/b0f21624-5850-4c60-b2f4-125656d5ac40.jar (deleted)
catalogd  21893  6689  impala  254r      REG              253,1 163923099     393230 /tmp/225e43c3-03a8-4b24-ba2e-14637e4d5bba.jar (deleted)
catalogd  21893  6689  impala  255r      REG              253,1  77023830     396109 /tmp/ee702167-27f2-4685-8217-8cec85f53a3c.jar (deleted)
catalogd  21893  6689  impala  258r      REG              253,1  72198042     393231 /tmp/2aeb7bb8-5bed-402d-9201-5c23859754d3.jar (deleted)
catalogd  21893  6689  impala  259r      REG              253,1  72198042 

通过结果可以发现,当前系统存在大量文件已经被删除(deleted),可是文件句柄并没有被释放的情况。

问题已经有答案了,因为系统中存在大量文件句柄没有释放,导致当前占用的磁盘空间无法释放。文件句柄释放不掉的根本原因,是因为当前有线程对句柄进行引用。


解决问题:

通过查询发现,有两种解决方案:

  1. 将当前线程进行重启,关闭线程,从而让句柄释放,释放空间
  2. 找到指定的文件句柄,将当前文件句柄的大小设置为空

根据当前的业务情况,需要对外提供实时服务,所以频繁重启不适合当前业务场景,那么只能选择将文件句柄内容置空。文件句柄内容置空,文件的内容大小被置空,释放了磁盘空间,但是文件句柄并没有释放,可能导致【Too Many File is Open】 错误。

lsof
command     PID USER   FD      type             DEVICE     SIZE       NODE NAME

lsof输出各列信息的意义如下:

COMMAND:进程的名称
PID:进程标识符
PPID:父进程标识符(需要指定-R参数)
USER:进程所有者
PGID:进程所属组
FD:文件描述符,应用程序通过文件描述符识别该文件。
  • 通过losf 获取当前文件的 PID 和 FD 两个参数
  • 置空当前的文件内容:
echo > /proc/PID/fd/FD
在 Java 中,正确删除和释放文件句柄是确保资源管理得当、避免资源泄漏的重要环节。以下是一些关键点和实现方法: ### 文件句柄的释放 Java 中使用 `FileInputStream` 或 `FileOutputStream` 等流对象时,会占用系统级别的文件句柄。如果不及时关闭这些流,可能会导致文件句柄泄漏,从而影响程序性能甚至引发异常。 为了正确释放文件句柄,应始终在 `finally` 块中调用 `close()` 方法,以确保即使发生异常也能正常释放资源[^1]。 ```java import java.io.File; import java.io.FileOutputStream; import java.io.IOException; public class FileHandleExample { public static void main(String[] args) { File file = new File("/home/admin/a.txt"); FileOutputStream out = null; try { out = new FileOutputStream(file); // 写入数据到文件 out.write("Hello, World!".getBytes()); } catch (IOException e) { e.printStackTrace(); } finally { if (out != null) { try { out.close(); // 关闭流以释放文件句柄 } catch (IOException e) { e.printStackTrace(); } } } boolean deleted = file.delete(); // 删除文件 if (deleted) { System.out.println("文件删除成功"); } else { System.out.println("文件删除失败"); } } } ``` ### 文件删除与句柄释放顺序 为了避免文件删除失败或句柄未被释放的问题,在执行 `delete()` 操作之前,必须确保所有对文件引用(如 `FileInputStream` 和 `FileOutputStream`)都已被关闭[^2]。 ### 调试文件句柄泄漏 在 Linux 系统上,可以使用 `lsof` 命令来查看当前打开的文件句柄。例如: - 查看所有与 Java 相关的打开文件: ```bash lsof -s | grep java ``` - 查看已删除但仍被占用的文件: ```bash lsof -s | grep deleted ``` 这些命令可以帮助识别是否存在文件句柄泄漏的情况,并采取相应措施进行修复。 ### 异常处理的重要性 在处理文件操作时,务必捕获并处理 `IOException`,以便在出现问题时能够及时响应。此外,使用 try-with-resources 结构(适用于 Java 7 及以上版本)可以自动管理资源,减少手动关闭流的需求。 ```java import java.io.File; import java.io.FileOutputStream; import java.io.IOException; public class TryWithResourcesExample { public static void main(String[] args) { File file = new File("/home/admin/a.txt"); try (FileOutputStream out = new FileOutputStream(file)) { out.write("Hello, World!".getBytes()); } catch (IOException e) { e.printStackTrace(); } boolean deleted = file.delete(); if (deleted) { System.out.println("文件删除成功"); } else { System.out.println("文件删除失败"); } } } ``` 通过这种方式,可以确保即使在写入过程中抛出异常,流也会自动关闭,从而有效防止文件句柄泄漏。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值