$ cat important_file > /dev/null &
[1] 9711
$ rm important_file
$ killall -STOP cat
[1]+ Stopped cat important_file > /tmp/p
$ ls -l /proc/`pidof cat`/fd/
total 0
lrwx------ 1 vi vi 64 May 13 20:32 0 -> /dev/pts/29
l-wx------ 1 vi vi 64 May 13 20:32 1 -> /tmp/p
lrwx------ 1 vi vi 64 May 13 20:32 2 -> /dev/pts/29
lr-x------ 1 vi vi 64 May 13 20:32 3 -> /home/vi/important_file (deleted)
Comment récupérer cela important_file
?
J'ai essayé quelque chose comme
injcode -m dup2 -ofd=3 -ofilename=/tmp/recovered_file -oflags=O_CREAT $PID_OF_CAT
mais ça ne fait rien.
readlink /proc/13381/fd/3
-> "/ home / vi / important_file (supprimé)" et/home/vi/important_file\ \(deleted\)
n'existe évidemment pas.... mieux que de copier à un moment donné (et de ne collecter que l'instantané du contenu du fichier) "
tail -f
" de copier ce fichier dans un nouveau fichier:(grâce aux programmeurs prudents de tail, qui fonctionneront même avec la sortie binaire.)
Pendant son exécution, le
tail -f
fichier lui - même reste ouvert, l'empêchant en toute sécurité d'être purgé du disque à la fin du programme d'origine. Ainsi, ne vous arrêtez pastail -f
immédiatement après la fin de votre programme original - vérifier la tail'ed d'/new/path/to/file
abord si c'est ce que vous voulez. Si ce n'est pas le cas (ou n'est pas satisfaisant pour toute autre raison), vous pouvez recopier le fichier d'origine, mais cette fois après tout, l'écriture est terminée par "Programme" et à partir detail -f
/ proc / PIDoftail / fd / répertoire.la source
Invalid cross-device link
.Utilisez lsof pour trouver le numéro d'inode et debugfs pour recréer un lien dur vers celui-ci. Par exemple:
Avant de vous plaindre, j'ai truqué la transcription ci-dessus car je n'ai pas de fichier supprimé à portée de main en ce 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érols
. Je pense que le noyau pourrait mettre en cache les données d'inode. Vous devriez probablement fsck à la première occasion 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 renommer le nom approprié. Le lier directement au nom de fichier d'origine semble entraîner une corruption de répertoire. YMMV!
la source
Vous pouvez simplement
cp
le fichier, à savoir:Bien sûr, si le fichier est toujours en cours de modification, vous rencontrerez des problèmes avec cette approche.
la source