... 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