La mejor manera de liberar espacio en disco de los archivos eliminados que se mantienen abiertos

28

Hola, tengo muchos archivos que se han eliminado, pero por alguna razón el espacio en disco asociado con los archivos eliminados no se puede utilizar hasta que elimine explícitamente el proceso del archivo que ocupa el espacio en disco

$ lsof /tmp/
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF      NODE NAME
cron     1623 root    5u   REG   0,21        0 395919638 /tmp/tmpfPagTZ4 (deleted)

El espacio en disco ocupado por el archivo eliminado anterior causa problemas, como cuando intento usar la tecla de tabulación para completar automáticamente una ruta de archivo. Obtengo el error bash: cannot create temp file for here-document: No space left on device

Pero después de ejecutar kill -9 1623el espacio para ese PID se libera y ya no obtengo el error.

Mis preguntas son:

  • ¿Por qué este espacio no se libera inmediatamente cuando el archivo se elimina por primera vez?
  • ¿Cuál es la mejor manera de recuperar el espacio de archivos asociado con los archivos eliminados?

y hágame saber cualquier terminología incorrecta que haya utilizado o cualquier otra información relevante y pertinente con respecto a esta situación.

BryanK
fuente

Respuestas:

26

En unidades, los nombres de archivo son solo punteros (inodes) que apuntan a la memoria donde reside el archivo (que puede ser un disco duro o incluso un sistema de archivos respaldado por RAM). Cada archivo registra el número de enlaces a él: los enlaces pueden ser el nombre de archivo (plural, si hay varios enlaces duros al mismo archivo), y también cada vez que se abre un archivo, el proceso realmente mantiene el "enlace" para El mismo espacio.

El espacio se libera físicamente solo si no quedan enlaces (por lo tanto, es imposible llegar a él). Esa es la única opción sensata: mientras se usa el archivo, no es importante si alguien más ya no puede acceder a él: lo está usando y hasta que lo cierre, todavía tiene control sobre él; ni ​​siquiera notará el nombre del archivo se ha ido o movido o lo que sea. Eso incluso se usa para archivos temporales: algunas implementaciones crean un archivo y lo desvinculan inmediatamente, por lo que no es visible en el sistema de archivos, pero el proceso que lo creó lo está utilizando normalmente. El complemento Flash es especialmente aficionado a este método: todos los archivos de video descargados se mantienen abiertos, pero el sistema de archivos no los muestra.

Entonces, la respuesta es que, si bien los procesos todavía tienen los archivos abiertos, no debe esperar recuperar el espacio. No está liberado, está siendo utilizado activamente. Esta es también una de las razones por las que las aplicaciones realmente deberían cerrar los archivos cuando terminen de usarlos. En el uso normal, no debe pensar en ese espacio como libre, y esto tampoco debería ser muy común en absoluto: con la excepción de los archivos temporales que están desvinculados a propósito, en realidad no debería haber ningún archivo que desee. considere no ser usado, pero aún abierto. Intente revisar si hay un proceso que lo hace mucho y considere cómo lo usa, o simplemente encuentre más espacio.

Orión
fuente
24

Los archivos se eliminan del sistema de archivos donde se elimina cualquier referencia a este inodo. La referencia puede estar en el disco (enlace en cualquier directorio) y ... desde aplicaciones abiertas. Si elimina el archivo, solo elimina la referencia del disco, pero aún hay referencia de la aplicación.

Entonces puedes "liberar" espacio de dos maneras:

  1. como se mencionó anteriormente: puede eliminar la aplicación, que abre el archivo.
  2. puedes ... truncar el archivo. Incluso si se elimina:

Si conoce pid - mire qué archivos están abiertos por este pid: ls -l / proc / PID / fd, vea aquí enlaces como:

undefine @ uml: ~ $ ls -l / proc / 18596 / fd
razem 0
lrwx ------ 1 undefine undefine 64 lut 1 00:06 0 -> / dev / pts / 30
lrwx ------ 1 undefine undefine 64 lut 1 00:06 1 -> / dev / pts / 30
lrwx ------ 1 undefine undefine 64 lut 1 00:05 2 -> / dev / pts / 30
lr-x ------ 1 undefine undefine 64 lut 1 00:06 3 -> / home / undefine / x (eliminado)
lr-x ------ 1 undefine undefine 64 lut 1 00:06 4 -> anon_inode: inotify

Como puede ver, se elimina 3 fd. puedes truncarlo por comando (por ejemplo):

undefine @ uml: ~ $:> / proc / 18596 / fd / 3
undefine @ uml: ~ $ 

Recuerde que si la aplicación lee este archivo, puede ser peligroso para ellos. Pero, si es solo un archivo de registro, puede truncarlo de forma segura.

indefinido
fuente
Tenga en cuenta que después de truncar el archivo, el proceso original que lo contiene aún puede agregarse al final (donde espera el final). el resultado son archivos aparentemente grandes pero dispersos que ocupan menos espacio en el disco (si el sistema de archivos admite archivos dispersos) y siguen creciendo.
törzsmókus
sí. Si algo escribe en el archivo, tendrá lugar en el disco. Es difícil evitarlo sin detener la aplicación que escribe en el disco;)
indefinido
8

Como han dicho otros, lsofse puede usar para enumerar todos los archivos eliminados que todavía están en el disco debido a los descriptores de archivos abiertos. Sin embargo, esta puede ser una lista muy larga. Aquí hay un comando que enumera estos archivos ordenados por tamaño ascendente en bytes:

sudo lsof -F sn0 | tr -d '\000' | grep deleted | sed 's/^[a-z]*\([0-9]*\)n/\1 /' | sort -n

Puede haber una forma más sucinta de hacer esto, pero el comando anterior funcionó para mí.

jcoffland
fuente
5

El espacio no se libera inmediatamente porque el proceso en ejecución todavía tiene un identificador de archivo abierto para el archivo que se acaba de eliminar. Después de todo, si un proceso todavía está tratando de usar un archivo, probablemente no desee que el núcleo lo elimine (el archivo). Eso podría hacer que el proceso sea un poco molesto. La mejor (y única, hasta donde yo sé) para liberar el espacio es hacer lo que hiciste: matar el proceso.

John
fuente
Probablemente una frase mejor que "cómo funciona" es "si un proceso todavía está usando un archivo, Unix no debería estar tratando de deshacerse de él".
Bratchley
Buen punto. He agregado eso a la respuesta.
John
-1

(Menta 17.1)

TL; DR:

  • Inspeccionar con sudo baobab(Analizador de uso de disco).
  • Limpiar rootla basura del usuario.

Contexto

Estaba atascado con un espacio cada vez menor mientras borraba constantemente archivos. Instalé el trash-clipaquete para vaciar la basura, pero esto no ayudó. Finalmente, noté que cuando ejecuté baobab(Disk Usage Analyzer en GUI, al menos en Mint 17.1) para inspeccionar la estructura del espacio en disco, me advirtió que algunas carpetas no eran accesibles. Entonces lo ejecuté como rootusando sudo baobab. Esto reveló el problema. Muchos de los archivos que se habían eliminado estaban en la papelera del rootusuario, no en mi propio usuario. Por lo tanto, no pude liberar el espacio. Luego simplemente vacié la basura usando como root ( sudo trash-cli) y todo mi espacio regresó.

Deleet
fuente
-1

Intenta usar el siguiente comando

lsof | grep deleted

y luego mata el pid del archivo eliminado.

Sumit Tyagi
fuente
El OP llegó tan lejos; Esto no responde a sus preguntas.
Jeff Schaller