Resolver rompe los enlaces simbólicos sin comprobar si hay existencia

Kirill:

Tengo un problema con mi aplicación Web Java: se produce un error después de unos días con error FileSystemException: Too many open files. Entiendo lo que significa, pero no puedo averiguar donde no cierre el archivo. Así que estoy tratando de escribir algo de código de depuración para ayudar a encontrar la causa de este error: este código se supone que devolver todos los descriptores de archivo (y se lo muestra a través de HTTP de depuración de punto final):

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())

Sin embargo, este código no muestra enlaces rotos (enlaces simbólicos, donde se eliminó objetivo). Path.toRealPath()falla con NoSuchFileExceptionaquí, Path.toFile().getCanonicalPath()hace caso omiso de tales enlaces y no muestra el destino. Único sistema ls -l /proc/$pid/fd/funciona correctamente y resolver todos los enlaces.

¿Es posible resolver estos enlaces utilizando Java (JDK 1.8)?

Daniel Junglas :

Volviendo mi comentario en una respuesta, puedo ver dos opciones de averiguar si un archivo es un enlace simbólico muertos:

  1. Utilizar Files.readSymbolicLink()y luego comprobar si el destino existe.
  2. Uso Files.exists()con otras opciones: Si el archivo existe con NOFOLLOW_LINKS, pero no existe sin esa opción, entonces debería ser un enlace simbólico colgado.

Supongo que te gusta

Origin http://10.200.1.11:23101/article/api/json?id=375048&siteId=1
Recomendado
Clasificación