Question

Je suis l'archivage d'un répertoire. Ce répertoire a un fichier qui est en cours d'écriture par un autre processus. Quand je Tar ce en utilisant tar Linux / Perl Module Tar, dans l'archive l'entrée du fichier est là, mais le contenu est nulle.

Avant goudronnage les fichiers sont ...

-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

Après avoir décompressé

-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

Comment puis-je résoudre ce problème? Je veux que le fichier soit dans l'archive avec le contenu qu'il a à l'instant, il est archivé. Ce fichier peut être un fichier journal et supposons que nous ne pouvons pas fermer le descripteur de fichier avant le goudronnage.

Était-ce utile?

La solution

Comme vous avez repéré la question avec « Linux » il y a une chance que vous utilisez une partition LVM. En effet, si vous utilisez sur une partition LVM, vous pouvez utiliser la fonction de snapshot LVM.

Voici un lien vers la de documentation sur la façon de LVM effectuer l'opération .

Voici une partie du instantané LVM intro:

  

Une merveilleuse installation fourni par LVM est des « instantanés ». Cela permet à l'administrateur de créer un nouveau dispositif de bloc qui présente une copie exacte d'un volume logique figé à un moment donné dans le temps. Typiquement, cela serait utilisé quand un traitement par lots, une sauvegarde par exemple, doit être effectuée sur le volume logique, mais vous ne voulez pas arrêter un système en direct qui change les données. Lorsque le dispositif de cliché instantané a été terminé avec l'administrateur du système peut simplement supprimer le périphérique. Cette installation ne nécessite que l'instantané soit faite à un moment où les données sur le volume logique est dans un état cohérent - le patch de verrouillage VFS-pour LVM 1 fait en sorte que certains systèmes de fichiers font automatiquement quand un instantané est créé, et beaucoup de dans les systèmes de fichiers noyau 2.6 font automatiquement lorsqu'un instantané est créé sans patcher.

Autres conseils

Essayez de copier les fichiers d'abord ...

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

... tarball puis tout ensemble ...

tar *.tmp abc.tar

... et nettoyer:

rm *.tmp

Si cela ne veut fonctionne pas, le processus en tenant la poignée de fichier ne pas partager l'accès en lecture ...

Vous pouvez constater que cela dépend du système de fichiers utilisé et l'application qui accède au fichier. Le plus proche d'une solution générique est d'utiliser un système de fichiers qui prend en charge des instantanés et de créer un instantané avant tar en cours d'exécution.

Votre deuxième sortie est faite après votre première, qui ne peut pas avoir raison. Je devine que tar est ici: quand il a fait son travail, le dossier était vide. Vous pouvez avoir affaire à une condition de course ici.

Comme d'autres l'ont dit, cela dépend du système de fichiers et système d'exploitation utilisé. sync premier (ou quel que soit l'équivalent est sur votre système de fichiers), copiez les fichiers dans un répertoire temporaire puis tar-les. Si le système de fichiers ne permet pas de copier un fichier ouvert, vous êtes SOL; Perl ne peut pas contourner les limitations du système de fichiers.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top