No Mac OSX, como posso abrir um arquivo excluído que ainda está aberto por um processo?

5
b2-osx108v8-01:~ bamboo$ lsof -p 264
COMMAND PID   USER   FD     TYPE            DEVICE  SIZE/OFF     NODE NAME
<lines removed>
java    264 bamboo   20w     REG               1,2    240906 14883372 /Users/bamboo/bamboo-agent-home/xml-data/build-dir/ST-SSINR-B2OSML/SimbaProcessManager.log.0
<lines removed>

O diretório /Users/bamboo/bamboo-agent-home/xml-data/build-dir/ST-SSINR-B2OSML já foi excluído, mas o arquivo ainda está aberto pelo nosso processo de daemon. Como posso ver este log? No Linux, eu usaria /proc/264/fd/20 , mas isso não parece estar disponível no OSX.

    
por Bwmat 05.06.2018 / 21:40

2 respostas

4

< EDITAR

Se este for o Linux, você também pode usar um truque gdb . Mas acontece que podemos descartar esse truque no OS X, porque ele depende do comportamento específico do Linux de /dev/fd/ ( /proc/self/fd/ ).

É tudo o que sei, não tenho uma sugestão positiva.

Poderia dar horrivelmente errado, mas você considerou gdb ? Dois milagres em um pacote: um interpretador de C e uma maneira de injetar código no processo de sua escolha! Aparentemente, você também pode usá-lo para depuração.

Felizmente, a biblioteca padrão C também inclui uma função que interpreta scripts. A linguagem de script na sua plataforma pode ser mais conveniente para escrever do que C ...

Eu pensei em um script que usa less para o OS X. Este é um hack frágil para voltar ao início do arquivo de log baseado em OS X, bash: menos funciona em descritores de arquivos abertos, o gato não Depois de ler todo o log arquivo com less , a posição FD deve estar no final do arquivo, que é esperançosamente a posição original antes de nos intrometermos nele.

< EDIT > Mas só funciona se o arquivo também estiver aberto para leitura. De acordo com a sua saída de lsof , o arquivo estava aberto apenas para gravação.

gdb -p 264 <<EOF
call (int) system("exec </dev/null >/tmp/log 2>&1; less /dev/fd/20")
EOF

Eu transmito o tipo de retorno, porque senão meu sistema reclamou que não sabia o tipo de retorno de system() . Presumivelmente, isso também significa que ele não tinha certeza dos tipos de argumentos, então isso já está soando como uma ótima idéia.

Usar o system() para manipular os descritores de arquivos de alguma forma funcionou quando tentei na minha caixa do Linux ... uma vez. Eu não prometo que sempre funcionará :). Por exemplo, tecnicamente, isso não é garantido como seguro se o programa estiver executando um manipulador de sinal ou mesmo system() . ( system() não é uma das poucas funções que garantidamente serão "reentrantes").

    
por 05.06.2018 / 22:23
0

Eu não verifiquei se icat se comporta corretamente quando operando em um dispositivo de bloco, nem se o Mac OS tem dispositivos de bloco, nem se os itens a seguir irão COMER SEUS DADOS.

Pode ser possível usar icat /dev/MY-DEVICE 14883372 . O comando icat é fornecido pelo The Sleuth Kit® (TSK).

link

(Você já mencionou o Linux. Esta idéia foi inspirada em debugfs , que tem um comando para fazer a mesma coisa para os sistemas de arquivos Linux ext2 / ext3 / ext4).

    
por 06.06.2018 / 00:11