Como recuperar um arquivo aberto mas excluído no Linux usando ln em vez de cp?

8

Eu tenho um arquivo que está baixando (de uma fonte difícil de baixar novamente), mas que foi excluído acidentalmente do espaço para nome do sistema de arquivos (/ tmp / blah) e gostaria de recuperar esse arquivo.

Normalmente, eu poderia cp /proc/$PID/fd/$FD /tmp/blah, mas neste caso, isso só me daria um instantâneo parcial, já que o arquivo ainda está sendo baixado. Além disso, assim que o download for concluído, o processo de download (por exemplo, Chrome) fechará o FD.

Alguma maneira de recuperar por inode / criar um link físico? Alguma outra solução? Se isso faz alguma diferença, estou principalmente preocupado com o ext4.

Yang
fonte

Respostas:

11

Tente usar o tail para copiar o arquivo continuamente:

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

Obviamente, você terá que interromper o processo inicial manualmente (ou algum outro meio externo) quando o download terminar.

Stijn Hoop
fonte
Funciona como um encanto. Eu acho que isso foi muito mais fácil do que eu pensava, já que tudo que você precisa é realmente apenas outro programa que abre o mesmo arquivo para mantê-lo por perto.
Yang
4

O projeto fdlink , que consiste em um módulo do kernel Linux e aplicativo simples, pretende criar um novo link para um descritor de arquivo aberto. Eu não tentei.

coneslayer
fonte
1

Isso fará o trabalho, mas não recuperando o inode:

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

Ou apenas interrompa manualmente o download no Chrome, se você não quiser matar o navegador inteiro.

Pavel
fonte
Se o problema fosse tão simples que eu pudesse retomar / fazer o download novamente! Esclarei a pergunta para indicar que não posso assumir que posso fazer o download novamente.
Yang
Parece problema :-) Parece que quaisquer hacks baseados em inode são muito baixos e específicos do sistema de arquivos.
Pavel
Sim, eu também adicionei isso à minha pergunta: se faz alguma diferença, estou principalmente preocupado com o ext4.
Yang
1

Se você deseja criar um link físico para isso, use a opção -s (consulte man ln) para executar o diretório fd ls -fe descobrir o número do arquivo (principalmente números de dois dígitos) e fazer umaln NUMBER destination-file -s

meisterlei
fonte