GNU/Linux >> Tutoriales Linux >  >> Linux

¿Buscar y eliminar archivos grandes que están abiertos pero se han eliminado?

¿Cómo se encuentran archivos grandes que se han eliminado pero que aún están abiertos en una aplicación? ¿Cómo se puede eliminar un archivo de este tipo, aunque un proceso lo tenga abierto?

La situación es que estamos ejecutando un proceso que está llenando un archivo de registro a un ritmo increíble. Conozco el motivo y puedo solucionarlo. Hasta entonces, me gustaría validar o vaciar el archivo de registro sin cerrar el proceso.

Simplemente haciendo rm output.log elimina solo las referencias al archivo, pero continúa ocupando espacio en el disco hasta que finaliza el proceso. Peor:después de 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.

Respuesta aceptada:

Si no puede eliminar su aplicación, puede truncar en lugar de eliminar el archivo de registro para recuperar el espacio. Si el archivo no se abrió en modo de adición (con O_APPEND ), el archivo aparecerá tan grande como antes la próxima vez que la aplicación escriba en él (aunque con la parte inicial escasa y con el aspecto de contener bytes NUL), pero el espacio se habrá recuperado (eso no se aplica a HFS+ sistemas de archivos en Apple OS/X que no admiten archivos dispersos).

Para truncarlo:

: > /path/to/the/file.log

Si ya se eliminó, en Linux, aún puede truncarlo haciendo:

: > "/proc/$pid/fd/$fd"

Donde $pid es la identificación del proceso que tiene el archivo abierto y $fd un descriptor de archivo lo tiene abierto (que puede verificar con lsof -p "$pid" .

Si no conoce el pid y está buscando archivos eliminados, puede hacer lo siguiente:

lsof -nP | grep '(deleted)'

lsof -nP +L1 , como lo mencionó @user75021, es una opción aún mejor (más confiable y más portátil) (lista de archivos que tienen menos de 1 enlace).

O (en Linux):

find /proc/*/fd -ls | grep  '(deleted)'

O para encontrar los grandes con zsh :

ls -ld /proc/*/fd/*(-.LM+1l0)

Una alternativa, si la aplicación está vinculada dinámicamente, es adjuntarle un depurador y hacer que llame a close(fd) seguido de un nuevo open("the-file", ....) .


Linux
  1. ¿Obtener todos los archivos que han sido modificados en una fecha específica?

  2. ¿Cómo puedo usar xargs para copiar archivos que tienen espacios y comillas en sus nombres?

  3. Buscar y copiar archivos

  4. Encuentra los archivos que han sido modificados en las últimas 24 horas

  5. Eliminar archivos que comienzan con pero no contienen

Encuentra archivos y directorios en Linux con el comando de búsqueda

Encuentra archivos grandes en Linux

¿Qué son los procesos zombis y cómo encontrar y eliminar procesos zombis?

Encuentre y elimine el archivo más antiguo si hay más de X archivos en un directorio en Linux

Cómo encontrar archivos duplicados en Linux y eliminarlos

Cómo abrir archivos y carpetas como administrador en Nautilus File Manager en Linux