$ 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)
Jak to odzyskać important_file
?
Próbowałem czegoś takiego
injcode -m dup2 -ofd=3 -ofilename=/tmp/recovered_file -oflags=O_CREAT $PID_OF_CAT
ale nic nie robi.
linux
file-recovery
Vi.
źródło
źródło
readlink /proc/13381/fd/3
-> „/ home / vi / important_file (usunięty)” i/home/vi/important_file\ \(deleted\)
oczywiście nie istnieje.... lepiej niż kopiowanie w danym momencie (i gromadzenie tylko migawki tego pliku z zawartością) jest „
tail -f
” dodanie tego pliku do nowego pliku:(dzięki ostrożnym programistom tail, którzy będą nawet pracować z wyjściem binarnym.)
Podczas działania
tail -f
sam utrzymuje plik otwarty, bezpiecznie zapobiegając jego wyczyszczeniu z dysku po zakończeniu oryginalnego programu. Dlatego nie zatrzymuj siętail -f
natychmiast po zakończeniu oryginalnego programu -/new/path/to/file
najpierw sprawdź, czy to jest to, czego chcesz. Jeśli nie jest (lub jest niezadowalający z jakiegokolwiek innego powodu), możesz ponownie skopiować oryginalny plik, ale tym razem po zakończeniu zapisywania do niego przez „Program” i nadal działającego programutail -f
/ proc / PIDoftail / katalog fd /.źródło
Invalid cross-device link
.Użyj lsof, aby znaleźć numer i-węzła, a debugfs, aby odtworzyć twardy link do niego. Na przykład:
Zanim narzekasz, sfałszowałem powyższą transkrypcję, ponieważ nie mam teraz pod ręką usuniętego pliku ;-)
Używam,
mi
aby zresetować czas usuwania i liczbę linków do rozsądnych wartości (odpowiednio 0 i 1), ale to nie działa poprawnie - widać, że liczba linków pozostaje na zerols
. Myślę, że jądro może buforować dane i-węzła. Prawdopodobnie powinieneś fsck jak najszybciej po użyciu debugfs, aby być bezpiecznym.Z mojego doświadczenia wynika, że należy utworzyć łącze przy użyciu tymczasowej nazwy pliku, a następnie zmienić nazwę na prawidłową. Łączenie go bezpośrednio z oryginalną nazwą pliku powoduje uszkodzenie katalogu. YMMV!
źródło
Możesz po prostu
cp
plik, tzn .:Oczywiście, jeśli plik jest nadal modyfikowany, będziesz mieć kłopoty z tym podejściem.
źródło