$ 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
?
Я пробовал что-то вроде
injcode -m dup2 -ofd=3 -ofilename=/tmp/recovered_file -oflags=O_CREAT $PID_OF_CAT
но это ничего не делает.
readlink /proc/13381/fd/3
-> "/ home / vi / важный_файл (удалено)" и,/home/vi/important_file\ \(deleted\)
очевидно, не существует.... лучше, чем копировать в определенный момент времени (и собирать только моментальный снимок содержимого файла), это "
tail -f
" этот файл в новый файл:(благодаря осторожным программистам tail, они будут работать даже с двоичным выходом.)
Во время его выполнения
tail -f
сам файл остается открытым, надежно предотвращая его удаление с диска при завершении исходной программы. Таким образом, не останавливайтеtail -f
сразу же после окончания вашей исходной программы -/new/path/to/file
сначала проверьте хвост , является ли это то, что вы хотите. Если это не так (или неудовлетворительно по любой другой причине), вы можете снова скопировать исходный файл, но на этот раз после того, как вся запись в него будет завершена «Программой» и из все еще работающегоtail -f
файла / proc / PIDoftail / FD / каталог.источник
Invalid cross-device link
.Используйте lsof, чтобы найти номер инода, и debugfs, чтобы воссоздать жесткую ссылку на него. Например:
Прежде чем жаловаться, я фальсифицировал приведенную выше стенограмму, так как у меня нет удаленного файла, который можно передать сейчас ;-)
Я использую
mi
для сброса времени удаления и количества ссылок на разумные значения (0 и 1 соответственно), но это не работает должным образом - вы можете видеть, что количество ссылок остается на нулеls
. Я думаю, что ядро может кэшировать данные inode. Вероятно, вы должны использовать fsck при первой же возможности после использования debugfs, чтобы быть в безопасности.По моему опыту, вы должны создать ссылку, используя временное имя файла, а затем переименовать в правильное имя. Связывание его непосредственно с исходным именем файла может привести к повреждению каталога. YMMV!
источник
Вы можете просто
cp
файл, то есть:Конечно, если файл все еще изменяется, у вас возникнут проблемы с этим подходом.
источник