GNU/Linux >> Linux Esercitazione >  >> Linux

Come recuperare il file cancellato se è ancora aperto da qualche processo?

... meglio che copiare in un dato momento (e raccogliere solo l'istantanea del contenuto del file di quel momento) è "tail -f " quel file in un nuovo file:

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

(grazie ai cauti programmatori di tail, funzionerà anche con l'output binario.)

Durante il suo runtime, il file tail -f stesso mantiene il file aperto, impedendo in modo sicuro che venga eliminato dal disco al termine del programma originale. Quindi, non fermare il tail -f subito dopo la fine del tuo programma originale - controlla il tail'ed /new/path/to/file prima se lo è ciò che vuoi. Se non lo è (o non è soddisfacente per qualsiasi altro motivo), puoi copiare nuovamente il file originale, ma questa volta dopo tutta la scrittura su di esso è terminata da "Programma" e dal tail -f ancora in esecuzione 's /proc/PIDoftail/fd/ directory.


Se /home è NFS, ci sarà un file .nfsNNNNNNNNNN in /home/vi a cui puoi accedere/copiare. Se home è un filesystem locale, dovresti essere in grado di fare la stessa cosa tramite il link /proc/PID/fd/3:

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

Se vuoi effettivamente annullare l'eliminazione del file, ecco un post sul blog sull'argomento.


Usa lsof per trovare il numero di inode e debugfs per ricreare un hard link ad esso. Ad esempio:

# 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

Prima che tu possa lamentarti, ho falsificato la trascrizione sopra perché non ho un file cancellato a portata di mano in questo momento;-)

Uso mi per reimpostare il tempo di eliminazione e il conteggio dei collegamenti a valori ragionevoli (rispettivamente 0 e 1), ma non funziona correttamente:puoi vedere che il conteggio dei collegamenti rimane a zero in ls . Penso che il kernel potrebbe memorizzare nella cache i dati dell'inode. Probabilmente dovresti fsck alla prima occasione dopo aver usato debugfs, per essere al sicuro.

Nella mia esperienza, dovresti creare il collegamento utilizzando un nome di file temporaneo e quindi rinominarlo con il nome corretto. Collegarlo direttamente al nome del file originale sembra causare il danneggiamento della directory. YMMV!

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

Linux
  1. Come recuperare un file cancellato in Linux

  2. Recupero di file cancellati accidentalmente?

  3. Come recuperare dopo che Kate si è schiantata?

  4. Recuperare un file cancellato??

  5. Come trovare ed eliminare file più vecchi di un determinato periodo di tempo in Linux

Come recuperare file cancellati in Linux

Come ripristinare o recuperare i comandi eliminati in Linux

Come recuperare file cancellati in Ubuntu tramite TestDisk

Come usare Linux per recuperare file cancellati

Come recuperare l'archiviazione di file eliminati ma ancora utilizzati su Linux?

Come ordinare l'output di ps in base all'ora di inizio del processo?