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?
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.
terminal
process
io-redirection
job-control
disown
rozcietrzewiacz
fonte
fonte
retty
programa inteligente .Respostas:
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/x
dispositivos 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 comandosfg
/bg
/jobs
fornecidos 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).
fonte
Apenas para abordar esta questão específica:
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).
fonte
Para responder à parte mais interessante da sua pergunta: para alterar a saída de um programa em execução ao vivo, você deve editar seus descritores de arquivo. Isso é bastante fácil de fazer com o gdb. É um truque, mas funciona.
Vejo:
/programming/593724/redirect-stderr-stdout-of-a-process-after-its-been-started-using-command-line
Um script auxiliar está disponível em http://users.linpro.no/ingvar/fdswap.sh.txt .
fonte
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 .
fonte