Domanda

Sono l'archiviazione di una directory. Questa directory ha un file che è stato scritto da un altro processo. Quando I tar questo usando / modulo Perl Tar Linux tar, in archivio la voce per il file è lì, ma i contenuti sono nulli.

Prima tarring i file sono ...

-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

Dopo scompattando

-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

Come posso risolvere questo problema? Voglio che il file si trovi nell'archivio con il contenuto che ha nel momento viene archiviati. Questo file può essere un file di registro e pensare che non possiamo chiudere l'handle di file prima di tarring.

È stato utile?

Soluzione

Come si contrassegnati alla domanda con "Linux" c'è una possibilità che si sta utilizzando una partizione LVM. Se davvero si sta eseguendo su una partizione LVM, è possibile utilizzare la funzione snapshot LVM.

Ecco un link al documentazione LVM su come eseguire l'operazione .

Ecco una parte del LVM snapshot intro :

  

Una struttura meravigliosa fornito da LVM è 'istantanee'. Questo consente all'amministratore di creare un nuovo dispositivo a blocchi che presenta una copia esatta di un volume logico, congelato a un certo punto nel tempo. In genere questo sarebbe stato utilizzato quando alcuni elaborazione batch, una copia di backup per esempio, deve essere eseguita sul volume logico, ma non si vuole fermare un sistema live che sta cambiando i dati. Quando il dispositivo dell'istantanea è stato finito con l'amministratore di sistema può solo rimuovere il dispositivo. Questa funzione richiede che l'istantanea essere fatta in un momento in cui i dati sul volume logico è in uno stato consistente - la patch VFS-serratura per LVM1 fa in modo che alcuni filesystem fanno automaticamente quando viene creato uno snapshot, e molti dei file system nel kernel 2.6 fanno automaticamente quando uno snapshot viene creato senza patch.

Altri suggerimenti

Provare a copiare i file prima ...

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

... poi tarball tutto insieme ...

tar *.tmp abc.tar

... e ripulire:

rm *.tmp

Se questo non funziona, allora il processo tenendo l'handle di file non vuole condividere l'accesso in lettura ...

È possibile che questo dipende dal file system utilizzato e l'applicazione che accede al file. Il più vicino ad una soluzione generica è quella di utilizzare un file system che supporta gli snapshot e di creare un'istantanea prima di eseguire tar.

La seconda uscita si chiude dopo il tuo primo luogo, che non può essere giusto. Sto indovinando che tar è proprio qui: quando stava facendo il suo lavoro, il file era vuoto. Si può avere a che fare con una condizione di competizione qui.

Come altri hanno detto, dipende dal file system e del sistema operativo in uso. sync prima (o qualunque sia l'equivalente è nel file system), copiare i file in una directory temporanea e quindi di catrame in su. Se il file system non consente di copiare un file aperto, allora sei SOL; Perl non può aggirare le limitazioni del file system.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top