¿Cómo se encuentran archivos grandes que se han eliminado pero que todavía están abiertos en una aplicación? ¿Cómo se puede eliminar dicho archivo, a pesar de que un proceso lo tiene abierto?
La situación es que estamos ejecutando un proceso que está llenando un archivo de registro a una velocidad excelente. Sé el motivo y puedo solucionarlo. Hasta entonces, me gustaría rm o vaciar el archivo de registro sin cerrar el proceso.
Simplemente hacerlo rm output.log
elimina solo las referencias al archivo, pero continúa ocupando espacio en el disco hasta que finaliza el proceso. Peor aún: rm
¡ahora no tengo forma de encontrar dónde está el archivo o qué tan grande es! ¿Hay alguna forma de encontrar el archivo y posiblemente vaciarlo, aunque todavía esté abierto en otro proceso?
Me refiero específicamente a los sistemas operativos basados en Linux como Debian o RHEL.
rm
archivos ed que todavía están abiertos?
lsof | grep "(deleted)"
. Cuando no haya más procesos que mantengan abierto un archivo eliminado, el núcleo liberará el inodo y los bloques de disco. Los procesos no tienen "controladores" mediante los cuales se les puede notificar que un archivo abierto, esencialmente bloqueado, se ha eliminado del disco.
lsof | grep '(deleted)'
funciona en Linux. En Linux, puede recibir notificaciones de eliminación de archivos (incluso archivos que ya no tienen ninguna entrada en ningún directorio que no sea / proc / some-pid / fd) con el mecanismo de inotificación (evento IN_DELETE_SELF)
somefile
y lo abrí en VIM, luego lo rm
edité en otro proceso bash. Luego ejecuto lsof | grep somefile
y no está allí, a pesar de que el archivo está abierto en VIM.
lsof -p <pid>
para enumerar sus archivos abiertos y sus tamaños. El archivo eliminado tendrá un al(deleted)
lado. El archivo eliminado se vinculará/proc/<pid>/fd/1
probablemente. No sé cómo hacer que un proceso deje de escribir en su descriptor de archivo sin terminarlo. Creo que eso dependería del proceso.