Как восстановить открытый, но удаленный файл в Linux, используя ln вместо cp?

8

У меня есть файл, который загружается (из источника, который трудно перезагружать), но случайно удален из пространства имен файловой системы (/ tmp / blah), и я хотел бы восстановить этот файл.

Обычно я мог бы просто cp /proc/$PID/fd/$FD /tmp/blah, но в этом случае это получило бы только частичный снимок, так как файл все еще загружается. Кроме того, после завершения загрузки процесс загрузки (например, Chrome) закроет FD.

Любой способ восстановить с помощью inode / создать жесткую ссылку? Любые другие решения? Если это имеет какое-то значение, меня больше всего интересует ext4.

Ян
источник

Ответы:

11

Попробуйте использовать tail для постоянного копирования файла:

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

Конечно, вам придется остановить хвостовой процесс вручную (или каким-либо другим внешним способом) после завершения загрузки.

Стейн Хооп
источник
Работает как шарм. Я думаю, это было намного проще, чем я думал, поскольку все, что вам нужно, это просто другая программа, которая открывает тот же файл, чтобы сохранить его.
Ян
4

Проект fdlink , состоящий из модуля ядра Linux и простого приложения, предназначен для создания новой ссылки на дескриптор открытого файла. Я не пробовал это.

coneslayer
источник
1

Это выполнит работу, но не через восстановление inode:

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

Или просто вручную остановите загрузку в Chrome, если вы не хотите убивать весь браузер.

Павел
источник
Если бы только проблема была настолько простой, что я мог бы просто возобновить / повторно загрузить! Я уточнил вопрос, чтобы указать, что я не могу предположить, что могу повторно загрузить.
Ян
Звучит как проблема :-) Кажется, что любые взломы на основе inode слишком низкоуровневые и специфичные для файловой системы.
Павел
Да, я только добавил это к своему вопросу: если это имеет какое-то значение, я главным образом обеспокоен ext4.
Ян
1

Если вы хотите сделать жесткую ссылку на это, вы должны использовать опцию -s (см. man ln), Чтобы в каталоге fd запустить ls -fи найти номер файла (в основном двузначные числа) и сделатьln NUMBER destination-file -s

meisterlei
источник