GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo recuperar un archivo eliminado si todavía está abierto por algún proceso?

... mejor que copiar en un momento dado (y recopilar solo la instantánea de ese momento del contenido del archivo) es "tail -f " ese archivo en un archivo nuevo:

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

(gracias a los cautelosos programadores de tail, eso incluso funcionará con salida binaria).

Durante su tiempo de ejecución, el tail -f mantiene el archivo abierto, evitando de forma segura que se elimine del disco cuando finaliza el programa original. Por lo tanto, no detengas el tail -f inmediatamente después de que finalice su programa original:verifique el /new/path/to/file con cola primero si es Lo que quieras. Si no es así (o no le satisface por cualquier otro motivo), puede volver a copiar el archivo original, pero esta vez después. toda la escritura ha terminado por "Programa" y desde el tail -f aún en ejecución 's /proc/PIDoftail/fd/ directorio.


Si /home es NFS, habrá un archivo .nfsNNNNNNNNNN en /home/vi al que podrá acceder/copiar. Si home es un sistema de archivos local, debería poder hacer lo mismo a través del enlace /proc/PID/fd/3:

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

Si realmente desea recuperar el archivo, aquí hay una publicación de blog sobre el tema.


Use lsof para encontrar el número de inodo y debugfs para volver a crear un enlace fijo a él. Por ejemplo:

# 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

Antes de que te quejes, falsifiqué la transcripción anterior porque no tengo un archivo eliminado a mano en este momento;-)

Yo uso 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 cero en ls . Creo que el núcleo podría estar almacenando en caché los datos del inodo. Probablemente deberías 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 al nombre adecuado. Vincularlo directamente al nombre del archivo original parece causar daños en el directorio. ¡YMMV!

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

Linux
  1. Cómo recuperar un archivo eliminado en Linux

  2. ¿Cómo recuperar un archivo eliminado en Linux?

  3. ¿Cómo recuperar un archivo abierto pero eliminado en Linux usando ln en lugar de cp?

  4. Unix/Linux recuperar/recuperar archivos borrados

  5. ¿Cómo ordenar la salida de ps por hora de inicio del proceso?

Cómo recuperar archivos borrados en Linux

Cómo restaurar o recuperar comandos eliminados en Linux

Cómo recuperar archivos borrados en Ubuntu a través de TestDisk

¿Recuperar archivos borrados accidentalmente?

¿Cómo recuperarse después de que Kate se estrella?

Cómo usar Linux para recuperar archivos borrados