Устранить неработающие символические ссылки c без проверки существования - PullRequest
0 голосов
/ 31 марта 2020

У меня проблема с моим Java веб-приложением: через несколько дней происходит сбой с ошибкой 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())

Но это код не показывает неработающие ссылки (обозначения c ссылки, где была удалена цель). Path.toRealPath() терпит неудачу с NoSuchFileException здесь, Path.toFile().getCanonicalPath() игнорирует такие ссылки и не показывает цель. Только система ls -l /proc/$pid/fd/ работает правильно и разрешает все ссылки.

Можно ли разрешить такие ссылки, используя Java (1.8 JDK)?

1 Ответ

1 голос
/ 31 марта 2020

Превращая мой комментарий в ответ, я вижу два варианта, чтобы выяснить, является ли файл мертвым символом c ссылка:

  1. Использовать Files.readSymbolicLink(), а затем проверить, существует ли цель .
  2. Используйте Files.exists() с другими параметрами: если файл существует с NOFOLLOW_LINKS, но не существует без этой опции, то это должна быть свисающая ссылка c ссылка.
...