Use lsof para encontrar o número do inode e debugfs para recriar um link físico para ele. Por exemplo:
# 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
Antes de você reclamar, falsifiquei a transcrição acima, pois não tenho um arquivo excluído no momento ;-)
Eu uso mi
para redefinir o tempo de exclusão e a contagem de links para valores sensíveis (0 e 1 respectivamente), mas não funciona corretamente - você pode ver que a contagem de links permanece em zero ls
. Eu acho que o kernel pode estar armazenando em cache os dados do inode. Você provavelmente deve fsck na primeira oportunidade depois de usar o debugfs, para estar do lado seguro.
Na minha experiência, você deve criar o link usando um nome de arquivo temporário e renomear para o nome apropriado. Vinculá-lo diretamente ao nome do arquivo original parece causar corrupção no diretório. YMMV!
readlink /proc/13381/fd/3
-> "/ home / vi / important_file (excluído)" e,/home/vi/important_file\ \(deleted\)
obviamente, não existe.