Come recuperare file aperti ma cancellati su Linux usando ln invece di cp?


8

Ho un file che si sta scaricando (da una fonte da cui è difficile scaricare di nuovo), ma accidentalmente eliminato dallo spazio dei nomi del filesystem (/ tmp / blah), e vorrei recuperare questo file.

Normalmente potrei solo cp /proc/$PID/fd/$FD /tmp/blah, ma in questo caso ciò mi procurerebbe solo un'istantanea parziale, poiché il file è ancora in fase di download. Inoltre, una volta completato il download, il processo di download (ad es. Chrome) chiuderà l'FD.

Qualche modo per recuperare tramite inode / creare un collegamento reale? Qualche altra soluzione? Se fa la differenza, mi occupo principalmente di ext4.

Risposte:


11

Prova a usare tail per copiare il file continuamente:

tail -c +0 -f /proc/$pid/fd/$fd > filename

Ovviamente, dovrai terminare manualmente il processo di coda (o altri mezzi esterni) al termine del download.


Funziona come un fascino. Immagino che sia stato molto più semplice di quanto pensassi, dal momento che tutto ciò che serve è davvero solo un altro programma che apre lo stesso file per tenerlo in giro.
Yang,

4

Il progetto fdlink , costituito da un modulo kernel Linux e una semplice applicazione, intende creare un nuovo collegamento a un descrittore di file aperto. Non l'ho provato


1

Ciò consentirà di completare il lavoro, anche se non ripristinando l'inode:

cp /proc/$PID/fd/$FD /tmp/blah
kill $PID
wget -c $URL -O /tmp/blah

O semplicemente interrompere manualmente il download in Chrome se non si desidera uccidere l'intero browser.


Se solo il problema fosse così semplice che potrei semplicemente riprendere / scaricare di nuovo! Ho chiarito la domanda per indicare che non posso presumere che sia possibile scaricare di nuovo.
Yang,

Sembra un problema :-) Sembra che qualsiasi hack basato su inode sia troppo basso livello e specifico del filesystem.
Pavel,

Sì, ho appena aggiunto anche questo alla mia domanda: se fa la differenza, mi occupo principalmente di ext4.
Yang,

1

Se vuoi fare un collegamento reale su questo, devi usare l'opzione -s (vedi man ln) quindi nella directory fd esegui ls -fe scopri il numero di file (principalmente numeri a due cifre) e crea unln NUMBER destination-file -s

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.