キリル:
私は私のJava Webアプリケーションに問題がある:それはエラーで数日後に失敗しましたFileSystemException: Too many open files
。私はそれが何を意味するかを理解し、私は近くにファイルしなかったところ、私は理解することはできません。このコードは、すべてのファイルディスクリプタ(およびデバッグ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)を使用して、このようなリンクを解決することは可能ですか?
ダニエルJunglas:
答えに私のコメントを参照すると、私は、ファイルが死んでシンボリックリンクであるかどうかを把握するために、2つのオプションを見ることができます:
- 使用
Files.readSymbolicLink()
して、ターゲットが存在するかどうかを確認してください。 - 使用
Files.exists()
異なるオプションで:ファイルが存在している場合でNOFOLLOW_LINKS
はなく、それがシンボリックリンクである必要があり、そのオプションなしでは存在しません。