Atualmente, o Tar está lendo um arquivo de 2 GB e eu excluí seu único link. Como eu paro de funcionar por uma eternidade?

4

Mais algumas informações:

Eu estava fazendo o backup de um diretório grande com tar , mas havia alguns arquivos grandes que eu não esperava. Essa conexão é pela rede e muito lenta, então simplesmente esperar não é uma opção.

Nenhum desses arquivos tem algo importante neles.

Eu apaguei o conteúdo dos primeiros com echo > file , que preservou o link para que o tar parasse de lê-los, mas eu e rm -rf um diretório inteiro enquanto tar lia um arquivo de 2GB esse diretório. Agora, tar detém o único link para ele, e não consigo encontrar nenhuma maneira de fazê-lo passar por cima dele completamente de novo.

O arquivo está em um sistema de arquivos ext4 sendo acessado pela rede pelo sshfs.

    
por Functino 30.09.2015 / 23:34

2 respostas

4

echo >file teria sido a solução direta. Mas depois de excluir o arquivo, isso não é mais possível.

Mas espere! Como você está usando um sistema de arquivos ext4, presumo que este tar esteja rodando no Linux. (Algumas, mas não todas, as variantes Unix permitem uma solução semelhante.) No Linux, você ainda pode acessar um arquivo excluído, mas aberto via /proc/PID/fd/FD , em que PID é o ID do processo que tem o arquivo aberto e FD é o descritor de arquivo pelo qual o arquivo está aberto. Este arquivo é um link simbólico para o arquivo, mas é um link mágico. Ele permanece válido mesmo se o arquivo for excluído. Se você olhar para ele com ls -l , verá algo como

/proc/1234/fd/4 -> /path/to/file (deleted)

em toda a aparência um link quebrado, mas na verdade você pode abrir este arquivo. Em Em particular, você pode truncá-lo com algo como : >/proc/1234/fd/4 .

Se você estiver trabalhando em um sistema sem /proc , poderá usar um depurador para fazer com que o próprio processo tar execute o truncamento para você. Anexe o depurador ao processo e, em seguida, execute truncate(4) , em que 4 é o descritor de arquivo do qual o tar está lendo. Por exemplo, com o GDB, você pode tentar algo como

$ ps
…     find the PID of the tar process, e.g. 1234
$ lsof -p1234
…     find the file descriptor that you want to act on, e.g. 4
$ gdb -pid 1234
…
(gdb) call truncate(4)
(gdb) detach

Isso pode ou não confundir o tar, já que poderia renderizar algumas estruturas de dados que ele está usando de maneira inconsistente, por isso recomendo experimentar antes de testá-lo.

    
por 01.10.2015 / 02:35
1

Pare o alcatrão?

ps aux | grep tar

Find the pid of the tar process

kill $PID
    
por 30.09.2015 / 23:40