GNU/Linux >> Tutoriels Linux >  >> Linux

Comment récupérer un fichier supprimé s'il est toujours ouvert par un processus ?

... mieux que de copier à un moment donné (et de ne rassembler que l'instantané du contenu du fichier à ce moment-là) est de "tail -f " ce fichier dans un nouveau fichier :

tail -c +0 -f /proc/PIDofProgram>/fd/# > /new/path/to/file

(grâce aux programmeurs prudents de tail, cela fonctionnera même avec une sortie binaire.)

Lors de son exécution, le tail -f lui-même garde le fichier ouvert, l'empêchant en toute sécurité d'être purgé du disque lorsque le programme d'origine se termine. Ainsi, n'arrêtez pas le tail -f immédiatement après la fin de votre programme d'origine - vérifiez le /new/path/to/file suivi d'abord si c'est l'est ce que tu veux. Si ce n'est pas le cas (ou s'il n'est pas satisfaisant pour toute autre raison), vous pouvez copier à nouveau le fichier d'origine, mais cette fois après toute écriture s'est terminée par "Program" et à partir du tail -f toujours en cours d'exécution du répertoire /proc/PIDoftail/fd/.


Si /home est NFS, il y aura un fichier .nfsNNNNNNNNNN dans /home/vi auquel vous pourrez accéder/copier. Si home est un système de fichiers local, vous devriez pouvoir faire la même chose via le lien /proc/PID/fd/3 :

cp /proc/PID/fd/3 /tmp/recovered_file

Si vous souhaitez réellement restaurer le fichier, voici un article de blog sur le sujet.


Utilisez lsof pour trouver le numéro d'inode et debugfs pour recréer un lien physique vers celui-ci. Par exemple :

# lsof -p 12345 | grep /var/log/messages
syslogd 12345 root    3w   REG                8,3    3000    987654 /var/log/messages (deleted)
# mount | grep var
/dev/sda2 on /var type ext3 (rw)
# debugfs -w /dev/sda2
debugfs: cd log
debugfs: ln <987654> tmp
debugfs: mi tmp
                      Mode    [0100600] 
                   User ID    [0] 
                  Group ID    [0] 
                      Size    [3181271] 
             Creation time    [1375916400] 
         Modification time    [1375916322] 
               Access time    [1375939901]
             Deletion time    [9601027] 0
                Link count    [0] 1
               Block count    [6232] 
                File flags    [0x0] 
...snip...
debugfs:  q
# mv /var/log/tmp /var/log/messages
# ls -al /var/log/messages
-rw------- 0 root root 3301 Aug  8 10:10 /var/log/messages

Avant que vous ne vous plaigniez, j'ai truqué la transcription ci-dessus car je n'ai pas de fichier supprimé à portée de main pour le moment ;-)

J'utilise mi pour réinitialiser le temps de suppression et le nombre de liens à des valeurs sensibles (0 et 1 respectivement), mais cela ne fonctionne pas correctement - vous pouvez voir que le nombre de liens reste à zéro dans ls . Je pense que le noyau pourrait mettre en cache les données d'inode. Vous devriez probablement fsck dès que possible après avoir utilisé debugfs, pour être du bon côté.

D'après mon expérience, vous devez créer le lien en utilisant un nom de fichier temporaire, puis le renommer avec le nom approprié. Le lier directement au nom de fichier d'origine semble provoquer une corruption du répertoire. YMMV !

  • http://glandium.org/blog/?p=87
  • http://www.cyberciti.biz/tips/linux-ext3-ext4-deleted-files-recovery-howto.html

Linux
  1. Récupération de fichiers supprimés accidentellement ?

  2. Comment récupérer après le crash de Kate ?

  3. Récupérer un fichier supprimé ? ?

  4. Comment récupérer un sémaphore lorsque le processus qui l'a décrémenté à zéro plante ?

  5. Comment récupérer un fichier supprimé sous Linux ?

Comment récupérer des fichiers supprimés sous Linux

Comment restaurer ou récupérer des commandes supprimées sous Linux

Comment récupérer des fichiers supprimés dans Ubuntu via TestDisk

Comment utiliser Linux pour récupérer des fichiers supprimés

Comment récupérer un fichier ouvert mais supprimé sous Linux en utilisant ln au lieu de cp ?

Comment récupérer le stockage de fichiers supprimés mais toujours utilisés sous Linux ?