Diretório excluído de um programa em execução [duplicado]

0

Eu iniciei um programa em um diretório, mas o removi acidentalmente, e o programa dentro dele. O programa gera alguns arquivos de saída. O programa ainda está em execução. Gostaria de saber se eu criar o mesmo diretório o programa ainda irá criar os arquivos de saída lá. Isso é possível?

    
por Andreu Heisenberg 20.11.2018 / 10:52

1 resposta

1

Quando as entradas dos arquivos forem removidas do sistema de arquivos, elas não poderão ser recriadas. Se você criar um novo diretório com o nome do diretório antigo, é apenas isso: um novo diretório. Os arquivos não aparecem magicamente novamente.

Sistemas de arquivos Unix (incluindo linux) funcionam tendo inodes que contêm todas as informações sobre um arquivo, exceto seu nome. Nos diretórios, as entradas são feitas com um nome e um número inode, esse é o único acoplamento do nome com seu conteúdo. É possível criar outro link para o arquivo usando ln , com um nome de arquivo completamente diferente.

Quando um arquivo é excluído, sua contagem de referência é reduzida. Uma vez atingido o zero, o arquivo é realmente excluído (o espaço ocupado é retornado ao conjunto de blocos livre e o inode é limpo). No entanto, enquanto um processo ainda tiver o arquivo aberto, a contagem de referência não chegará a zero, o arquivo ainda existe.

O Linux torna os arquivos abertos por um processo disponível através do /proc/ pseudo filesystem. Se você conhece o ID do processo (pid) do processo, procure em / proc / pid / fd / para obter uma lista de arquivos abertos. Por exemplo. para um processo apache , aqui está uma lista abreviada:

$ sudo ls -l /proc/32704/fd
total 0
lr-x------ 1 root root 64 Nov 20 02:39 0 -> /dev/null
l-wx------ 1 root root 64 Nov 20 02:39 1 -> /dev/null
lr-x------ 1 root root 64 Nov 20 02:39 10 -> /dev/random
lrwx------ 1 root root 64 Nov 20 02:39 11 -> /tmp/.ZendSem.6DE1g1 (deleted)
lrwx------ 1 root root 64 Nov 20 02:39 12 -> anon_inode:[eventpoll]
l-wx------ 1 root root 64 Nov 20 02:39 2 -> /var/log/apache2/error.log

Anote a linha com (deleted) anexada a ela. O Apache usa isso para um arquivo temporário que não pode ser acessado por outras pessoas: ele cria e abre o arquivo e, em seguida, o desvincula (remove). No entanto, ele ainda pode usá-lo, e os processos filhos do apache também podem usá-lo à medida que herdam arquivos abertos.

No seu caso, você também deve ser capaz de encontrar os arquivos excluídos. Através das entradas / proc, você pode copiar os arquivos "excluídos" para algum lugar seguro enquanto o processo estiver em execução:

sudo cp /proc/pid/fd/x $HOME/somewheresafe/filename
    
por 20.11.2018 / 13:00

Tags