解决断开的符号链接而不检查是否存在
Resolve broken symbolic links without checking for existance
我的 Java webapp 有问题:它在几天后失败并出现错误 FileSystemException: Too many open files
。我明白它的意思,但我想不通我没有关闭文件的地方。所以我试图编写一些调试代码来帮助我找到这个错误的原因:这段代码应该 return 所有文件描述符(并通过调试 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()
在这里失败并显示 NoSuchFileException
,Path.toFile().getCanonicalPath()
忽略此类链接并且不显示目标。只有系统 ls -l /proc/$pid/fd/
可以正常工作并解析所有链接。
是否可以使用 Java (1.8 JDK) 解析此类链接?
将我的评论变成答案,我可以看到两个选项来确定文件是否是死符号 link:
- 使用
Files.readSymbolicLink()
然后检查目标是否存在
- 使用具有不同选项的
Files.exists()
:如果文件存在 NOFOLLOW_LINKS
但没有该选项则不存在,那么它应该是一个悬空符号 link.
我的 Java webapp 有问题:它在几天后失败并出现错误 FileSystemException: Too many open files
。我明白它的意思,但我想不通我没有关闭文件的地方。所以我试图编写一些调试代码来帮助我找到这个错误的原因:这段代码应该 return 所有文件描述符(并通过调试 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()
在这里失败并显示 NoSuchFileException
,Path.toFile().getCanonicalPath()
忽略此类链接并且不显示目标。只有系统 ls -l /proc/$pid/fd/
可以正常工作并解析所有链接。
是否可以使用 Java (1.8 JDK) 解析此类链接?
将我的评论变成答案,我可以看到两个选项来确定文件是否是死符号 link:
- 使用
Files.readSymbolicLink()
然后检查目标是否存在 - 使用具有不同选项的
Files.exists()
:如果文件存在NOFOLLOW_LINKS
但没有该选项则不存在,那么它应该是一个悬空符号 link.