Eu estava tentando inspecionar um processo rejeitado curl
, que foi iniciado em um login anterior. Eu posso ver que (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
E eu estava tentando ver até onde estava indo o download, 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 a saída? Obrigado!
Ver é fácil:
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 deve ser feito rapidamente para evitar que as conexões sejam interrompidas.
Como diz o JdeBP, isso é impossível sem anexar como um depurador. Felizmente, existem programas para fazer exatamente isso de forma totalmente automatizada. Reptyr é um desses programas. Basta executar
reptyr 17193
e ele será reconectado ao seu terminal.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 pseudoterminal cujo lado mestre foi fechado. Não há como, a não ser por medidas extremas, como depurar o processo e interceptar chamadas do sistema, acessar sua saída.
Estas são as semânticas dos terminais.
Se você desligar a sessão do terminal (ou seja, desligar o dispositivo serial de um terminal real, sair de uma sessão de login em um dispositivo de terminal virtual do kernel, desligar o lado mestre de um pseudo-terminal usado por SSH/terminais virtuais do espaço do usuário/TELNET/rlogin/ emuladores de terminal X11) os descritores de arquivo aberto para processos que ainda fazem referência a esse terminal não devem causar E/S nem estar conectados a nada mais. É a abordagem do Unix para combater programas de cavalo de tróia que costumavam se agarrar a descritores de arquivos abertos para dispositivos de terminal e usá-los para apresentar prompts de login falsos para o próximo usuário do terminal.
Há muito tempo, isso gerou programas como
tmux
, GNU Screen, mosh ouconsole-terminal-emulator
que mantêm o lado mestre de um pseudoterminal aberto, emulam a exibição e a entrada de um terminal e permitem processos de cliente/realizador desconectáveis e reconectáveis (ou seja, o "cliente" partes detmux
e GNU Screen; clientes mosh; ouconsole-fb-realizer
,console-termio-realizer
, ou algum outro) 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 nosh ou algum outro sistema semelhante se desejar reconectabilidade.Leitura adicional
revoke
. Manual de Chamadas do Sistema FreeBSD . 2016-01-25.vhangup
. Manual do Programador Linux . Páginas de manual do Debian. 15/03/2016.