Mover un archivo a un archivo que se está leyendo

10

Cuando se mueve un archivo y el archivo de destino ya existe y se está leyendo actualmente, ¿tendrá éxito la operación? ¿Dependerá de cuánto dura la operación de lectura en el archivo de destino?

Desmond Hume
fuente

Respuestas:

9

La operación de lectura tendrá éxito, independientemente del tiempo que lleve completar la operación de lectura.

¿Por qué y cómo funciona esto?

Cuando comienza la operación de lectura, el Inode del archivo se usa como un controlador desde el que se lee el contenido del archivo.

Al mover otro archivo al archivo de destino, el resultado será un nuevo inodo, lo que significa que el contenido físico del archivo en el disco se colocará en otro lugar y no se tocará el contenido original del archivo que se está leyendo.

Lo único que tienen en común es su ruta / nombre de archivo, mientras que el inodo subyacente y la ubicación física en el disco cambian.

Una vez que finaliza la operación de lectura (dado que ningún otro proceso todavía tiene un identificador de archivo abierto en el archivo antiguo y no hay otros enlaces duros que hagan referencia a su inodo), los datos antiguos se descartarán.

Una vez que se completa la operación de movimiento, el archivo tendrá un nuevo número de índice de inodo.

Puede mostrar el número de índice de inodo de archivos usando ls -i /tmp/some-file.

Por el mismo motivo descrito anteriormente, es posible eliminar archivos que todavía están en uso por una aplicación, ya que las aplicaciones que usan el archivo solo leerán desde el inodo (señalando el contenido real del archivo en el disco) mientras que la referencia de los archivos en el sistema de archivos se elimina.

Elias Probst
fuente
1
Olvidó mencionar los enlaces duros: cuando finalice la operación de lectura, si ese inodo está vinculado desde otra entrada del directorio, los datos no se eliminarán (porque todavía tiene un nombre).
cjm
Gracias por señalarlo, edité mi respuesta y la agregué.
Elias Probst