O que acontece com a saída de um processo que foi renegado e perdeu seu terminal?

26

Se eu fechar o terminal virtual, onde algum processo foi iniciado, a saída vai diretamente para /dev/nullou pode poluir a memória de alguma forma? Posso, de qualquer forma, pegar a saída para continuar a lê-la a qualquer momento depois disso?

[EDIT]: Então, o momento de repudiar um processo efetivamente é o fim do meu poder de controlar sua produção?

Também notei que, se eu negar um processo parado, a princípio tudo parecerá normal: ele não será encerrado nem mostrado em trabalhos. Mas se eu sair (e não pretendo fechar o terminal, apenas sair de su, por exemplo), o processo será encerrado. Mesmo assim, um processo deserdado em execução em segundo plano pode continuar em execução.

rozcietrzewiacz
fonte
2
Para o "posso de qualquer maneira pegar a saída": não sem truques sujos. Mas veja Como posso negar um processo em execução e associá-lo a um novo shell de tela? e outras perguntas citadas para truques sujos (todos baseados em anexar um depurador ao programa e de alguma forma fazê-lo abrir um arquivo de saída diferente).
Gilles 'SO- stop be evil'
Obrigado pelo link para essa pergunta. Isso me deu a melhor resposta até agora! Especialmente o rettyprograma inteligente .
rozcietrzewiacz
11
Veja também esta resposta em uma pergunta relacionada.
Stéphane Gimenez

Respostas:

11

O fato de um processo ser "rejeitado" tem apenas um significado para o shell interativo que criou esse processo. Isso significa que o shell não inclui (mais) o processo em sua tabela de tarefas e que o SIGHUP não será enviado para esse processo quando o shell sair. Não está realmente relacionado às suas perguntas.

Sobre o que acontece com as saídas enviadas para um terminal virtual excluído: Eu mesmo fiz alguns testes e notei que os /dev/pts/xdispositivos não estão acessíveis e não serão alocados novamente até que todos os filedescriptors que apontam para eles tenham sido fechados. Portanto, não vejo uma razão pela qual as gravações em um terminal excluído seriam armazenadas. Eu acho que isso nem é definido pelo POSIX.

Sobre pegar a saída de algum processo que grava em um terminal, acho que não é possível, mesmo quando o terminal ainda está ativo¹. Tudo o que você pode fazer é pegar a entrada direta no terminal (por exemplo, pressionamentos de teclas ou pressionamentos de teclas simulados pela parte principal de um bloco). Se os processos lerem no stdin o que está escrito em seus terminais, isso levaria a um auto-loop para a maioria dos processos.

Sobre a última observação sobre o encerramento do processo, eu realmente não sei o que está acontecendo, mas suspeitaria de comportamentos bastante estranhos com sinais (SIGTTOU, SIGTTIN, SIGHUP ou outros) relacionados ao primeiro plano / estado de segundo plano dos grupos de processos, quando a sessão saídas do líder (por exemplo su, no caso que você mencionou).

Resposta ao Edit: Não, no que diz respeito à saída, nada muda quando um processo é rejeitado: ele ainda está conectado ao seu terminal de controle (a menos que já se desconecte já como os daemons). Você pode ver isso usando ps. No entanto, você não poderá mais usar os comandos fg/ bg/ jobsfornecidos pelo shell para esse processo. Isso significa que pode ser difícil alimentá-lo com a entrada do terminal (requer estar no grupo de processos em primeiro plano).

-
1. a menos que o processo esteja disposto ou sequestrado com algumas ferramentas de depuração (veja os comentários acima).

Stéphane Gimenez
fonte
11
Obrigado por esclarecer isso um pouco. Na verdade, o fato de negar um processo ainda está relacionado à minha pergunta: depois de negar um processo, pareço perder a capacidade de controlar sua saída, certo? (Mesmo que o terminal não tenha sido fechado.) Editarei a pergunta para incluir esse caso.
rozcietrzewiacz 31/07
4

Apenas para abordar esta questão específica:

Se eu fechar o terminal virtual, onde algum processo foi iniciado, a saída vai diretamente para / dev / null ou pode poluir a memória de alguma forma?

O terminal e o (s) programa (s) conectado (s) a ele se comunicam através de um dispositivo tty, lendo e gravando-o como um arquivo. Especificamente, um terminal virtual cria um "pseudo-tty" ("pty" para abreviar) e gera um processo de shell (ou outro) e conecta o stdin / out / err desse processo ao pty. (Os detalhes variam de acordo com o sistema operacional.)

Quando você fecha o terminal virtual, o terminal virtual fecha o final da conexão (o pty "mestre"). Depois disso, se o programa na outra extremidade da conexão gravar no tty, um erro será retornado e os dados não serão levados a lugar algum. Da mesma forma, se ele ler a partir do tty, receberá um indicador EOF (fim do arquivo).

Chris Page
fonte
Obrigado - explicação agradável e clara do ponto de vista da programação.
rozcietrzewiacz 04/04/11
0

Graças ao comentário de Gilles, apontando-me para essa pergunta , aprendi sobre um programa chamado retty .

Parece usar algum truque sujo para se reconectar a uma (pseudo-) tty efetivamente permitindo continuar lendo a saída de um processo - não importa se foi ou não rejeitado. Portanto, isso parece responder à maior parte da primeira parte da minha pergunta. A segunda foi respondida por Stéphane .

rozcietrzewiacz
fonte