$ 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)
¿Cómo recuperar esto important_file
?
Intenté algo como
injcode -m dup2 -ofd=3 -ofilename=/tmp/recovered_file -oflags=O_CREAT $PID_OF_CAT
Pero no hace nada.
linux
file-recovery
Vi.
fuente
fuente
readlink /proc/13381/fd/3
-> "/ home / vi / important_file (eliminado)" y/home/vi/important_file\ \(deleted\)
obviamente no existe.... mejor que copiar en un momento dado (y reunir solo la instantánea del contenido del archivo) es "
tail -f
" ese archivo en un archivo nuevo:(gracias a los programadores cautelosos de tail, eso incluso funcionará con salida binaria).
Durante su tiempo de ejecución, el
tail -f
mismo mantiene el archivo abierto, evitando de forma segura que se purgue del disco cuando finaliza el programa original. Por lo tanto, no detenga el programatail -f
inmediatamente después de que finalice su programa original; compruebe/new/path/to/file
primero si es lo que desea. Si no lo es (o es insatisfactorio por cualquier otro motivo), puede copiar el archivo original nuevamente, pero esta vez después de que toda la escritura haya terminado por "Programa" y desde eltail -f
/ s / proc / PIDoftail / aún en ejecución directorio fd /.fuente
Invalid cross-device link
.Use lsof para encontrar el número de inodo y debugfs para recrear un enlace rígido a él. Por ejemplo:
Antes de quejarse, falsifiqué la transcripción anterior ya que no tengo un archivo eliminado en este momento ;-)
Utilizo
mi
para restablecer el tiempo de eliminación y el recuento de enlaces a valores razonables (0 y 1 respectivamente), pero no funciona correctamente: puede ver que el recuento de enlaces permanece en cerols
. Creo que el núcleo podría estar almacenando en caché los datos del inodo. Probablemente debería fsck lo antes posible después de usar debugfs, para estar seguro.En mi experiencia, debe crear el enlace con un nombre de archivo temporal y luego cambiar el nombre por el nombre correcto. Vincularlo directamente al nombre del archivo original parece causar daños en el directorio. YMMV!
fuente
Puede simplemente
cp
el archivo, es decir:Por supuesto, si el archivo aún se está modificando, tendrá problemas con este enfoque.
fuente