Como posso fechar um terminal sem matar seus filhos (sem executar o `screen` primeiro)?

35

às vezes, executo um aplicativo no terminal gnome, mas, de repente, tenho que reiniciar o gnome ou algo assim. Eu acho que a resposta para a pergunta também é útil, então eu quero desconectar do SSH onde algo está acontecendo.

A árvore terminal do Gnome fica assim:

gnome-terminal
    bash
        some-boring-process

Can I 'desconexão' bashde gnome-terminal(ou desanexar some-boring-processdo bash e redirecionar o seu lugar de saída)? Se eu matar gnome-terminal, bashserá morto a todos os seus subprocessos

valya
fonte

Respostas:

48

Se some-boring-processestiver em execução na sua sessão atual do bash:

  1. interrompa-o com ctrl-zpara fornecer o prompt do bash
  2. colocá-lo em segundo plano com bg
  3. anote o número do trabalho ou use o jobscomando
  4. desanexe o processo desta sessão do bash com disown -h %1(substitua o número do trabalho real lá).

Isso não faz nada para redirecionar a saída - você precisa pensar nisso ao iniciar seu processo chato. [Editar] Parece haver uma maneira de redirecioná-lo https://gist.github.com/782263

Mas, falando sério, olhe para a tela. Tenho shell em um servidor remoto que está em execução há meses.

Glenn Jackman
fonte
Obrigado. Selecionei sua resposta porque era a única que responde à pergunta (tratava-se de executar o processo). Eu já estou usando screenpor vezes, embora tem seus problemas e eu não quero usá-lo para cada sessão de festa na minha vida
valya
Você não o usa em todas as sessões do bash, mas em todas as máquinas remotas nas quais passa muito tempo.
Glenn Jackman
Tomei a liberdade de adicionar informações sobre como redirecionar a saída, por favor, revise-a!
#Value '04
[root @ server ~] # bg -bash: bg: current: não existe esse trabalho
Muhammad Dyas Yaskur
Por que eu peguei bash: bg: current: no such job?
Muhammad Dyas Yaskur
10

É exatamente para isso que a tela e o tmux foram criados. Você executa o shell dentro da sessão screen / tmux e pode desconectar / reconectar à vontade. Você também pode ter várias sessões de shell executando dentro de um terminal gnome.

jsbillings
fonte
Obrigado, mas, como eu comentei a resposta aceita: 1. a pergunta era sobre o processo em execução. 2. screentem seus problemas e eu não me sinto como usá-lo para todas as sessões de festa na minha vida
valya
6

screen, tmuxOu dtach(possivelmente com dvtm) são todos grandes para isso, mas se é algo que você não pensou em usar um desses, você pode ser capaz de alavancagem nohup.

Hank Gay
fonte
Obrigado, mas, como eu comentei a resposta aceita: 1. a pergunta era sobre o processo em execução. 2. screentem seus problemas e eu não me sinto como usá-lo para todas as sessões de festa na minha vida
valya
@ Valya Fico feliz que você encontrou uma solução. Apenas para esclarecer, no entanto, nohupfunciona em um processo em execução usando a -popção (se disponível).
Hank Gay
@Hank Gay: Não consigo ver uma -popção nohupnas páginas de manual; em que sistema você está?
Mikel
@ Mikel Antes de aprender a parar de me preocupar e amar tmux, usei a -popção em uma caixa Solaris. Também tenho vagas lembranças de fazê-lo em uma caixa híbrida do CentOS (possivelmente zshpossui um suporte interno que suporte isso?), Mas não consigo encontrar documentos sobre isso.
Hank Gay
@Hank Gay: Nem bashnem zshno meu sistema Ubuntu Linux fornecer nohup.
Mikel
4

Se você deseja continuar interagindo com o processo filho, em vez de apenas realizá -lo e mantê-lo em andamento, existe realmente um programa chamado retty, que é uma prova de conceito para "roubar" um processo de seu tty atual e conectá-lo novamente ao atual.

No entanto, ele faz algumas coisas horríveis, incluindo colar algum código de montagem na pilha do aplicativo reconectado. E esse código não foi atualizado para x86_64.

Há outro programa que adota uma abordagem talvez melhor, congelando o processo no espaço do usuário para um arquivo, do qual ele pode ser restaurado posteriormente (possivelmente em outro tty.) Isso é criopídeo e esse projeto também parece ter parado no fase de prova de conceito e não funciona com o Linux moderno como o código está. Ah bem.

Apenas pensei que isso deveria estar aqui para ser completo. Se você não se importa em recorrer a um vodu horrível, isso está dentro do reino da possibilidade - pelo menos, da possibilidade teórica.

mattdm
fonte
11
que me lembra gist.github.com/782263 ... oh, que essência parece responder a minha pergunta, também
valya
2

Se eu acionar algo que eu quero terminar, não importa o que aconteça (com exceção da reinicialização do sistema), eu uso nohupe o executo em segundo plano. Ao contrário da tela e similares, você não pode se reconectar aos processos. No entanto, descobrindo o redirecionamento em qualquer outro local em qualquer saída nohup.out.

Eu uso screenquando quero poder mudar de terminal para um processo. Como iniciar um processo em casa / trabalho e mudar para o outro. Como qualquer outra saída da sessão do terminal, será possível rolar a parte superior do buffer.

EDIT: Se você já iniciou o processo, você pode disownimpedir que o HUPsinal seja enviado quando o processo for fechado.

BillThor
fonte
Obrigado, mas, como eu comentei a resposta aceita: 1. a pergunta era sobre o processo em execução. 2. screentem seus problemas e eu não me sinto como usá-lo para todas as sessões de festa na minha vida
valya
@valya Vi referências para desconectar um processo em execução do grupo de programas. Eu não conheço nenhuma ferramenta para fazer isso. A ferramenta provavelmente precisaria redirecionar também os canais de E / S padrão. Acho que posso ter funcionado uma vez, mas decidi que o nohup era mais simples.
BillThor
1

Você pode fazer com que um processo (PID) não receba um sinal HUP quando a sessão do terminal terminar. Use o seguinte comando:

nohup -p PID
Tony
fonte
nohup: invalid option -- 'p'. Qual versão nohupvocê está executando em que tipo de sistema?
Anthon
Eu uso principalmente o Solaris e o AIX. Para Linux, você deve verificar o comando disown.
Tony
Sim, não há -popção no Linux, portanto, esta resposta é específica para Solaris e AIX. No entanto, é bom saber
Sergiy Kolodyazhnyy
1

Esse script desanexa o processo filho do pai e o atribui ao processo init :

toDetach=$1

./$toDetach & # Runs the process - script on background

disown -h %$(jobs -l | grep $(ps -A | grep $toDetach | cut --delimiter=' ' -f1) | cut --delimiter=' ' -f1 | tr -d '[]+') # and then disowns it from parents process
mark_infinite
fonte