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 NoSuchFileException
aquí, 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)?
Volviendo mi comentario en una respuesta, puedo ver dos opciones de averiguar si un archivo es un enlace simbólico muertos:
- Utilizar
Files.readSymbolicLink()
y luego comprobar si el destino existe. - Uso
Files.exists()
con otras opciones: Si el archivo existe conNOFOLLOW_LINKS
, pero no existe sin esa opción, entonces debería ser un enlace simbólico colgado.