Como redirecionar uma saída do processo em execução quando o dispositivo de saída é excluído

1

Eu estava tentando inspecionar um processo deserdado curl , que foi iniciado em um login anterior. Eu posso ver que ele (PID 17193) ainda está em execução:

$ ps aux | grep curl
17193 jack 7700 3692 S      1:00 20:48  curl https://examples.com/file.ext -O
18124 jack 3576  876 S      0:00 21:18  grep curl

Eu estava tentando ver até onde o download está indo, mas a saída dele foi excluída:

$ ls -l /proc/17193/fd
total 0
lrwx------    1 jack users           64 May 19 20:50 0 -> /dev/pts/1 (deleted)
lrwx------    1 jack users           64 May 19 20:50 1 -> /dev/pts/1 (deleted)
lrwx------    1 jack users           64 May 19 20:50 2 -> /dev/pts/1 (deleted)
lrwx------    1 jack users           64 May 19 20:50 3 -> socket:[2343571]
l-wx------    1 jack users           64 May 19 20:50 4 -> /dir/file.ext

O que devo fazer para ver o resultado? Obrigado!

    
por jackxujh 19.05.2018 / 15:26

3 respostas

1

Isso não é possível sem um depurador.

A saída padrão e o erro padrão do seu programa estão indo para o lado escravo de um pseudo-terminal cujo lado mestre foi fechado. Não há como evitar medidas extremas, como depurar o processo e interceptar chamadas do sistema, para acessar sua saída.

Estas são as semânticas dos terminais.

Se você desligar a sessão do terminal (ou seja, desligar um dispositivo serial do terminal real, sair de uma sessão de login em um dispositivo de terminal virtual do kernel, desligue o lado mestre de um pseudo-terminal como usado pelos terminais virtuais SSH / user-space / TELNET / rlogin / emuladores de terminais X11) os descritores de arquivos abertos para processos que ainda fazem referência a esse terminal são destinados a não causar E / S nem estarem conectados a mais nada. É a abordagem Unix para combater programas de cavalo de Tróia que costumavam esperar para abrir descritores de arquivos para dispositivos de terminal e usá-los para apresentar prompts de login falsos para o próximo usuário do terminal.

Há muito tempo, programas como tmux , GNU Screen, mosh ou console-terminal-emulator que fica segurando o lado mestre de um pseudo-terminal aberto, emula a exibição e entrada de um terminal e permite processos cliente / realizador desconectáveis e reconectáveis (isto é, as partes "cliente" de tmux e GNU Screen ; mosh clientes ou console-fb-realizer , console-termio-realizer , ou alguns outros, para renderizar isso em dispositivos reais.

Portanto, use tmux , GNU Screen, mosh, um terminal virtual de espaço de usuário do conjunto de ferramentas do nose, ou algum outro sistema, se você quiser reconectabilidade.

Leitura adicional

por 20.05.2018 / 00:23
2

Ver é fácil:

cat /proc/17193/fd/1 ; tail -n 0 -f /proc/17193/fd/1

O redirecionamento real é complicado. Você pode anexar um depurador ao processo em execução, fechar o fd e abri-lo para um novo arquivo. Mas com a rede ativa, acho que isso tem que ser feito rapidamente para evitar que as conexões sejam quebradas.

    
por 19.05.2018 / 16:11
2

Como o JdeBP diz, isso é impossível sem anexar como um depurador. Felizmente, existem programas para fazer exatamente isso de uma maneira totalmente automatizada. O Reptyr é um desses programas. Basta executar reptyr 17193 e ele será reconectado ao seu terminal.

    
por 20.05.2018 / 05:47

Tags