7 votes

Comment puis-je copier un fichier qui a été supprimé instantanément ?

J'ai un script, ce script crée un dump en /path/of/directory et le supprime instantanément. Je veux copier ce dump avant qu'il ne soit supprimé.

J'ai essayé ;

dump=$(ls -a | grep -E "^[0-9]+$")
cp $dump fulldump

Mais je n'ai obtenu que la moitié du script, pas l'intégralité.

19voto

Mattio Points 817

Félicitations, il semble que vous ayez créé un condition de course .

  • Deux processus sont course pour effectuer des opérations sur le même fichier.

  • En général, les conditions de course sont considérées comme un bogue pour exactement la raison que vous avez rencontrée - les résultats sont imprévisibles.

Il existe plusieurs façons de corriger une situation de course (sémaphores, lockfiles, délais, etc.). Certaines peuvent impliquer un codage assez important.

Cependant, dans votre cas précis, vous avez posé une question sur une script . Heureusement, vous pouvez modifier les scripts. La solution la plus simple est de modifier votre scripts pour placer le dump à l'endroit de votre choix.

19voto

Max_Espoir Points 306

Vous pouvez utiliser le chattr pour empêcher la suppression de fichiers (tout en autorisant la création et la modification de fichiers), ainsi que d'autres autorisations pratiques.

Pour le répertoire :

sudo chattr -R +a /TEMP/

ou si seulement le fichier (existant) :

sudo chattr +a /TEMP/youCantDeleteMe.txt

Pour rétablir les permissions, utilisez -a à la place de +a

$ mkdir Documents/TEMP && cd $_
$ echo can edit > youCantDeleteMe.txt 

$ sudo chattr -R +a ../TEMP/

$ echo after plusA on file>> youCantDeleteMe.txt 
$ cat youCantDeleteMe.txt 
can edit
after plusA on file

$ sudo rm youCantDeleteMe.txt 
rm: cannot remove 'youCantDeleteMe.txt': Operation not permitted

$ ls -lA
-rw-rw-r-- 1 v v   25 Sep  5 05:59 youCantDeleteMe.txt
$ echo . > youCantDeleteMe.txt 
bash: youCantDeleteMe.txt: Operation not permitted

$ touch somebody
$ ls -lA
-rw-rw-r-- 1 v v  0 Sep  5 06:04 somebody
-rw-rw-r-- 1 v v 25 Sep  5 05:59 youCantDeleteMe.txt

$ sudo rm somebody 
rm: cannot remove 'somebody': Operation not permitted

$ sudo chattr +a ./undel.txt
chattr: No such file or directory while trying to stat ./undel.txt

Et pour supprimer ultérieurement le fichier

$ sudo chattr -R -a ../TEMP/
$ ls -lA
drwxrwxr-x 2 v v 4096 Sep  5 06:17 .
drwxr-xr-x 7 v v 4096 Sep  5 05:57 ..
-rw-rw-r-- 1 v v    0 Sep  5 06:04 somebody
-rw-rw-r-- 1 v v   25 Sep  5 05:59 youCantDeleteMe.txt

$ rm -rf ./*
$ ls -la
drwxrwxr-x 2 v v 4096 Sep  5 06:17 .
drwxr-xr-x 7 v v 4096 Sep  5 05:57 ..

15voto

Nate Eldredge Points 604

El strace est généralement utilisé pour montrer les appels système effectués par un processus, mais il peut aussi les intercepter.

Essayez :

strace -f -e inject=unlink,unlinkat:retval=0 /the/script script-args...

Ensuite, à chaque fois que le processus ou ses enfants invoquent la fonction unlink o unlinkat les appels système (qui sont les moyens normaux de supprimer un fichier), strace l'interceptera et lui fera retourner 0, indiquant le succès, mais sans faire quoi que ce soit.

Il y aura beaucoup de sorties retraçant tous les appels système. Vous pouvez ajouter -e trace=unlink,unlinkat pour afficher uniquement ces appels, ou -o logfile pour envoyer l'ensemble de la sortie vers un fichier (éventuellement /dev/null ). Assurez-vous que ces arguments soient placés avant /the/script sur la ligne de commande.

Notez que cela empêchera le script d'effacer tout des fichiers du tout ; j'espère que ça ne pose pas de problème. Il y a un -P option pour strace qui est censé limiter le traçage aux appels qui accèdent à un fichier donné, mais je n'ai pas réussi à le faire fonctionner correctement dans un test simple.

D'autres variantes sont également possibles : par exemple, vous pouvez faire en sorte que l'option unlink / unlinkat Les appels système échouent avec un code d'erreur, ou bien ils envoient SIGSTOP au processus pour que vous puissiez le consulter avant de le poursuivre. Consultez la page de manuel de strace pour plus de détails sur toutes ses possibilités.

6voto

Anton Petrov Points 380

En fonction de la vitesse à laquelle le vidage est ouvert puis écrit, vous pourrez peut-être créer une dur établir un lien avec elle pendant qu'elle est en cours de rédaction. Ce lien dur garantira que l'espace de données ne sera pas désalloué lorsque le fichier sera supprimé en utilisant son nom original. Par exemple :

your-script &
ln /path/of/directory/dumpfile /some/other/path/on/the/same/filesystem
wait   #  wait until your-script exits
do-something-with /some/other/path/on/the/same/filesystem

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X