Pregunta

Estoy archivar un directorio. Este directorio tiene un archivo que está siendo escrito por otro proceso. Cuando este módulo Tar usando tar Linux / Perl Tar, en el archivo de la entrada para el archivo está ahí, pero los contenidos son nulos.

Antes de tarring los archivos son ...

-rw-r--r--  1 irraju dba 28 Feb 18 02:22 a
-rw-r--r--  1 irraju dba 25 Feb 18 02:23 b
-rw-r--r--  1 irraju dba 29 Feb 18 03:38 c

Después de desempaquetar

-rw-r--r-- irraju/dba       28 2009-02-18 02:22:58 a
-rw-r--r-- irraju/dba       25 2009-02-18 02:23:17 b
-rw-r--r-- irraju/dba        0 2009-02-18 03:33:12 c

¿Cómo puedo solucionar este problema? Quiero que el archivo sea en el archivo con el contenido que ha en el instante en que se archiva. Este archivo puede ser un archivo de registro y asumir que no podemos cerrar el identificador de archivo antes de embreado.

¿Fue útil?

Solución

Como se ha etiquetado a la pregunta con "Linux" hay una posibilidad de que esté utilizando una partición LVM. Si, efectivamente, se está ejecutando en una partición LVM, puede utilizar la característica de instantáneas de LVM.

Aquí hay un enlace a la LVM sobre la forma de realizar la operación .

Aquí hay una parte de la LVM instantánea introducción :

  

Un establecimiento maravilloso proporcionada por LVM es 'instantáneas'. Esto permite al administrador para crear un nuevo dispositivo de bloque que presenta una copia exacta de un volumen lógico, congelado en un cierto punto en el tiempo. Normalmente, esto sería utilizado cuando algún procesamiento por lotes, una copia de seguridad, por ejemplo, necesita ser realizada en el volumen lógico, pero que no quiere detener un sistema vivo que está cambiando los datos. Cuando el dispositivo de instantánea se ha acabado con el administrador del sistema puede simplemente quitar el dispositivo. Esta instalación requiere que la instantánea se hizo en un momento en que los datos sobre el volumen lógico está en un estado coherente - el parche VFS-cerradura para LVM1 se asegura de que algunos sistemas de ficheros hacen automáticamente cuando se crea una instantánea, y muchos de los sistemas de archivos en el núcleo 2.6 lo hacen automáticamente cuando se crea una instantánea sin parchear.

Otros consejos

Trate de copiar los archivos en primer lugar ...

cp a a.tmp
cp b b.tmp
cp c c.tmp

... entonces tarball todo junto ...

tar *.tmp abc.tar

... y limpiar:

rm *.tmp

Si eso no funciona, entonces el proceso que tiene el identificador de archivo no quiere compartir el acceso de lectura ...

Es posible que esto depende del sistema de archivos utilizado y la aplicación que se está accediendo al archivo. Lo más cercano a una solución genérica es el uso de un sistema de archivos que soporta instantáneas y crear una instantánea antes de ejecutar el alquitrán.

Se hace su segunda salida después su primera, que puede no ser adecuado. Supongo que tar está aquí: cuando estaba haciendo su trabajo, el archivo estaba vacío. Es posible que se trata de una condición de carrera aquí.

Como han dicho otros, que depende del sistema de archivos y sistema operativo que se utiliza. sync primera (o lo que es el equivalente del sistema de archivos), copiar los archivos a un directorio temporal y luego alquitrán para arriba. Si el sistema de archivos no se permitirá copiar un archivo abierto, entonces estás SOL; Perl no ha podido superar las limitaciones del sistema de archivos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top