解析残破的符号链接,无需检查是否存在

问题描述 投票:0回答:1

我的Java Web应用程序有问题:几天后失败,错误为FileSystemException: Too many open files。我理解这意味着什么,但是我无法弄清没有关闭文件的位置。因此,我试图编写一些调试代码来帮助我找到此错误的原因:该代码应该返回所有文件描述符(并通过debug http端点显示它):

Files.list(Paths.get(String.format("/proc/$d/fd", pid))).map(
  fd -> String.format(
    "%s:%s",
    fd.getFileName(),
    // also I tried fd.toRealPath()
    fd.toFile().getCanonicalFile()
  )
).collect(Collectors.toList())

但是此代码不会显示断开的链接(删除目标的符号链接)。 Path.toRealPath()在此处失败,并带有NoSuchFileExceptionPath.toFile().getCanonicalPath()会忽略此类链接,并且不会显示目标。只有系统ls -l /proc/$pid/fd/可以正常工作并解决所有链接。

是否可以使用Java(1.8 JDK)解析此类链接?

java linux symlink file-descriptor
1个回答
1
投票

将我的评论变成答案,我可以看到两个选项来确定文件是否为无效的符号链接:

  1. 使用Files.readSymbolicLink(),然后检查目标是否存在。
  2. Files.exists()与不同的选项一起使用:如果文件带有NOFOLLOW_LINKS,但没有该选项就不存在,那么它应该是悬挂的符号链接。
© www.soinside.com 2019 - 2024. All rights reserved.