Jak odzyskać otwarty, ale usunięty plik w systemie Linux za pomocą ln zamiast cp?

8

Mam plik, który jest pobierany (ze źródła, z którego trudno jest ponownie pobrać), ale przypadkowo został usunięty z przestrzeni nazw systemu plików (/ tmp / blah) i chciałbym go odzyskać.

Zwykle mógłbym cp /proc/$PID/fd/$FD /tmp/blah, ale w tym przypadku dostałbym tylko częściową migawkę, ponieważ plik jest nadal pobierany. Ponadto po zakończeniu pobierania proces pobierania (np. Chrome) zamknie FD.

Jakiś sposób na odzyskanie przez i-węzeł / utworzenie twardego łącza? Jakieś inne rozwiązania? Jeśli robi to jakąkolwiek różnicę, głównie interesuje mnie ext4.

Yang
źródło

Odpowiedzi:

11

Spróbuj użyć tail do ciągłego kopiowania pliku:

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

Oczywiście po zakończeniu pobierania będziesz musiał ręcznie zatrzymać proces ogona (lub innymi środkami zewnętrznymi).

Stijn Hoop
źródło
Działa jak marzenie. Myślę, że było to o wiele łatwiejsze niż myślałem, ponieważ tak naprawdę wystarczy tylko inny program, który otwiera ten sam plik, aby go utrzymać.
Yang,
4

Projekt fdlink , składający się z modułu jądra Linux i prostej aplikacji, ma na celu utworzenie nowego łącza do otwartego deskryptora pliku. Nie próbowałem tego.

coneslayer
źródło
1

Spowoduje to wykonanie zadania, ale nie poprzez odzyskanie i-węzła:

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

Lub po prostu ręcznie zatrzymaj pobieranie w Chrome, jeśli nie chcesz zabić całej przeglądarki.

Pavel
źródło
Gdyby tylko problem był tak prosty, że mógłbym tylko wznowić / ponownie pobrać! Wyjaśniłem pytanie, aby wskazać, że nie mogę założyć, że mogę ponownie pobrać.
Yang
Brzmi jak kłopot :-) Wygląda na to, że wszelkie hacki oparte na i-węzłach są zbyt niskie i specyficzne dla systemu plików.
Pavel
Tak, właśnie dodałem to do mojego pytania: jeśli robi to jakąkolwiek różnicę, głównie interesuje mnie ext4.
Yang
1

Jeśli chcesz zrobić twardy link na ten temat, musisz użyć opcji -s (zobacz man ln), więc w katalogu fd uruchom ls -fi znajdź numer pliku (głównie liczby dwucyfrowe) i zróbln NUMBER destination-file -s

meisterlei
źródło