Как восстановить удаленный файл, если он все еще открыт каким-то процессом?

$ 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) 

Как восстановить этот important_file файл?

Я попробовал что-то вроде

  • Как восстановить файлы из жесткого диска linux ext4
  • Восстановление документов Excel, которые были закрыты без сохранения
  • Бесплатный инструмент для восстановления данных для Linux?
  • Удалять большие файлы - миссия невозможна?
  • Как восстановить файлы на разделе btrfs?
  • Восстановление файла Linux
  •  injcode -m dup2 -ofd=3 -ofilename=/tmp/recovered_file -oflags=O_CREAT $PID_OF_CAT 

    Но он ничего не делает.

  • Схема разбиения на HDD + SSD-система
  • Как вы протираете незапланированное дисковое пространство?
  • Как мне сопоставить долю сети с помощью терминала Linux?
  • Скрыть файлы в Linux без использования точки
  • Команда «rpl» Linux не заменяет текст
  • Как цветной вывод grep
  • 4 Solutions collect form web for “Как восстановить удаленный файл, если он все еще открыт каким-то процессом?”

    Если / home – NFS, в / home / vi будет файл .nfsNNNNNNNNNN, который вы можете получить / скопировать. Если home – это локальная файловая система, вы можете сделать то же самое через ссылку / proc / PID / fd / 3:

     cp /proc/PID/fd/3 /tmp/recovered_file 

    Если вы хотите действительно восстановить файл, вот запись в блоге по этому вопросу.

    … лучше, чем копировать в данный момент (и собирать только моментальный снимок содержимого файла), чтобы « tail -f » этот файл в новый файл:

    tail -c +0 -f /proc/PIDofProgram>/fd/# > /new/path/to/file

    (Благодаря осторожным программистам хвоста, которые будут работать даже с двоичным выходом).

    Во время выполнения tail -f сам сохраняет файл открытым, надежно предотвращая его очистку от диска, когда исходная программа заканчивается. Таким образом, не останавливайте tail -f сразу после окончания вашей исходной программы – сначала проверьте файл tail'ed /new/path/to/file , является ли он тем, что вы хотите. Если это не так (или неудовлетворительно по какой-либо другой причине), вы можете снова скопировать исходный файл, но на этот раз после того, как все его записи закончились с помощью «Программы» и из оставшегося tail -f 's / proc / PIDoftail / fd /.

    Используйте lsof для поиска номера inode и debugfs для воссоздания жесткой ссылки на него. Например:

     # 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 

    Прежде чем вы начнете жаловаться, я подделал вышеупомянутую стенограмму, так как у меня нет удаленного файла для раздачи прямо сейчас 😉

    Я использую mi чтобы сбросить время удаления и количество ссылок на разумные значения (0 и 1 соответственно), но он не работает должным образом – вы можете увидеть, что количество ссылок остается равным нулю в ls . Я думаю, что ядро ​​может кэшировать данные inode. Вероятно, вам следует воспользоваться fsck при первой возможности после использования debugfs, чтобы быть в безопасности.

    По моему опыту, вы должны создать ссылку, используя временное имя файла, а затем переименуйте имя. Прямое связывание с исходным именем файла вызывает повреждение каталога. YMMV!

    Вы можете просто cp файл, то есть:

     cp /proc/<pid>/fd/<fdno> /new/path/to/file 

    Конечно, если файл все еще изменяется, у вас возникнут проблемы с этим подходом.

    Давайте будем гением компьютера.