2009-04-30 12 views
12

Alguien está cargando FTP un archivo de tamaño 10Mb a la carpeta en un servidor de Linux. Mientras el archivo está en transición, un cron se activa y lanza un script Perl que está diseñado para mirar la carpeta ftp y mover lo que encuentre allí a alguna carpeta alternativa. Estoy usando la función move() de File::Copy. El proceso de Perl realmente cambia el nombre de los archivos como parte de su tarea. ¿Eso importa, o al FTP no le importa cómo el sistema de archivos describe el archivo?¿Qué pasará si Perl intenta llamar a move() en un archivo que se está cargando?

¿Oirá move() y moverá un archivo parcial, dejando que el FTP haga qué? ¿O se moverá y devolverá 0?

+0

gracias por votar mi pregunta! :) –

+3

una de las mejores características de Linux en comparación con Windows IMHO es que puedes hacer cosas para abrir archivos como mover, renombrar e incluso eliminar y las aplicaciones que los tienen abiertos serán totalmente ignorantes. Incluso puede eliminar programas mientras se están ejecutando y continuarán funcionando bien (pero una vez que salgan, nunca podrán recuperarlos ...) – rmeador

+0

¿Qué es mover() y hacia dónde se mueven las cosas? ¿Es posible copiar archivos en lugar de simplemente renombrarlos? –

Respuesta

10

No, la mudanza solo debería permitir completar el proceso de descarga en la nueva posición. Simplemente estás moviendo el inodo de una posición a otra. El descriptor de archivo abierto del programa de descarga aún debe apuntar a él.

Solo quiero repetir lo que algunos otros mencionaron. Esto solo funciona mientras la operación de movimiento esté en el mismo sistema de archivos. Si es como otro sistema de archivos distinto del inodo, no se puede transferir porque siempre pertenece al mismo sistema de archivos. El escenario más probable sería que los datos parciales en ese momento se copien en la nueva ubicación mientras el programa todavía se descarga en el antiguo inodo que ya no está adjunto a un archivo y por lo tanto no se puede usar.

+1

Renombrando aquellos que no importan porque no cambia el inodo. En el sistema de archivos, el nombre está asociado con inodos. Mover y renombrar son casi los mismos con respecto a su pregunta. Un archivo nuevo con el nombre de archivo antiguo solo contendrá otro inodo y no será problemático. En caso de que esta sea su próxima pregunta :) –

+2

Advertencia: si se mueve a través de sistemas de archivos, la carga finalizará, pero no podrá acceder al archivo, ya que no existirá ninguna referencia al inode. Terminará con un archivo parcial en el otro sistema de archivos. –

1

No estoy seguro, pero lo más probable es que no ocurra nada malo. Mudarse no cambia el número de inodo del archivo, por lo que el servidor FTP no notará el movimiento y continuará escribiendo en el archivo en la nueva ubicación. Para decirlo brevemente, el move() tendrá éxito y la carga continuará en la nueva ubicación.

5

Dado que no existe un estándar move, es difícil saber qué está sucediendo en su escenario. Si se refería al rename, entonces probablemente no tenga ningún problema, ya que la principal forma en que su situación podría salir mal es mover el archivo de un sistema de archivos a otro (y por lo tanto hacer una copia y eliminar, no una movimiento real), y en la mayoría de los sistemas rename fallará en esas circunstancias. (Así que si su configuración funciona, estará bien.)

Si no está usando rename pero alguna función move que, por ejemplo, manejará el movimiento a través de sistemas de archivos, entonces muy bien podría terminar con un archivo parcial si se trata de varios sistemas de archivos. (Esto puede terminar siendo un juego muy desagradable si, por ejemplo, ahora estás en un solo sistema de archivos, pero luego estos archivos que estás cargando ocupan mucho espacio y agregas un disco dedicado a almacenarlos - y ahora estás haciendo un movimiento cross-filesystem.)

+0

Estoy usando la función de movimiento perl, que creo que es simplemente un contenedor> mv -src -dest Específicamente el código es move ("$ ftpDir $ inFile", "$ someOtherDir $ newFileName"); –

+2

Si se trata de un contenedor alrededor del sistema/bin/mv, entonces corre el riesgo de archivos parciales, * si y solo si * se mueve a través de sistemas de archivos (ahora o en el futuro). – chaos

+0

Pero mientras el sistema de archivos sea el mismo, ¿está de acuerdo en que no hay daño? –

Cuestiones relacionadas