Como posso fechar um terminal sem matar seus filhos (sem executar a 'tela' primeiro)?

30

às vezes executo um aplicativo no gnome-terminal, mas de repente preciso 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 de terminais do Gnome é assim:

gnome-terminal
    bash
        some-boring-process

Posso desanexar bash de gnome-terminal (ou desanexar some-boring-process do bash e redirecionar sua saída para algum lugar)? Se eu apenas matar gnome-terminal , bash será morto para todos os seus subprocessos

    
por valya 02.03.2011 / 15:15

7 respostas

41

Se some-boring-process estiver em execução na sua sessão atual:

  1. interrompa com ctrl-z para fornecer o prompt bash
  2. coloque em segundo plano com bg
  3. anote o número do trabalho ou use o comando jobs
  4. separe o processo desta sessão bash com disown -h %1 (substitua o número do trabalho real lá).

Isso não faz nada para redirecionar a saída - você tem que pensar nisso quando você inicia seu processo chato. [Edit] Parece haver uma maneira de redirecionar o link

Mas, sério, olhe para a tela. Eu tenho shells em um servidor remoto que estão em execução há meses.

    
por 02.03.2011 / 16:10
10

Isso é exatamente o que tela e tmux foram criados para. 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 sendo executadas dentro de um terminal gnome.

    
por 02.03.2011 / 15:17
6

screen , tmux , ou dtach (possivelmente com dvtm ) são ótimos para isso, mas se é algo em que você não pensou em usar um desses, você pode aproveitar nohup .

    
por 02.03.2011 / 15:19
4

Se você quiser continuar interagindo com o processo filho, em vez de apenas contextualizá-lo e mantê-lo funcionando, existe um programa chamado retty que é uma prova de conceito para" roubar "um processo do seu atual tty e reconectá-lo ao atual.

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

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

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

    
por 02.03.2011 / 21:58
2

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

Eu uso screen quando quero poder trocar os terminais de um processo. Como iniciar um processo de casa / trabalho e mudar para o outro. Como qualquer outra saída de sessão de terminal, a saída irá eventualmente rolar pela parte superior do buffer.

EDIT: Se você já tiver lançado o processo, você pode disown o processo para evitar que o sinal HUP seja enviado quando o processo for fechado.

    
por 02.03.2011 / 15:33
1

Você pode fazer um processo (PID) não receber um sinal HUP quando a sessão de terminal for finalizada. Use o seguinte comando:

nohup -p PID
    
por 18.02.2016 / 06:35
1

Este script separa 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
    
por 29.09.2016 / 23:18