Como posso deserdar um processo em execução e associá-lo a um novo shell de tela?

153

Eu tenho um programa em execução em um shell SSH. Eu quero fazer uma pausa e ser capaz de cancelar sua execução quando eu voltar.

Uma maneira que pensei em fazer isso foi transferir sua propriedade para um shell de tela, mantendo-a em execução lá.

Existe uma maneira diferente de proceder?

    
por levesque 13.11.2010 / 19:04

9 respostas

86

Usando o GNU screen é sua melhor aposta.

Tela inicial em execução quando você faz login pela primeira vez - executo screen -D -R , executo seu comando e ou a desconecto ou suspendo com CTRL-Z e, em seguida, desconecto da tela pressionando CTRL-A , em seguida D .

Quando você fizer login na máquina novamente, reconecte-o executando screen -D -R . Você estará no mesmo shell de antes. Você pode executar jobs para ver o processo suspenso, se você o fez, e executar %1 (ou o respectivo trabalho #) para forçá-lo novamente.

    
por 06.03.2011 / 19:31
106

Você pode revogar a "propriedade" do programa a partir do shell com o disown embutido:

# press Ctrl+Z to suspend the program
bg
disown

No entanto, isto apenas diz ao shell para não enviar um sinal SIGHUP para o programa quando o shell sair. O programa manterá qualquer conexão que tenha com o terminal, geralmente como fluxos padrão de entrada, saída e erro. Não há como recolocá-los em outro terminal. ( Tela funciona emulando um terminal para cada janela, então os programas são anexados à janela de tela.)

É possível reconectar os descritores de arquivo a um arquivo diferente, anexando o programa em um depurador (ou seja, usando ptrace ) e fazendo com que ele chame open , dup e close . Existem algumas ferramentas que fazem isso; Este é um processo complicado e, às vezes, eles irão travar o processo. As possibilidades incluem (links coletados de respostas para Como posso deserdar um processo em execução e associá-lo a um novo shell de tela? e Posso nohup / tela de um processo já iniciado? ):

por 13.04.2017 / 14:36
63

Para mover um processo entre os terminais ou para reativar um deserdado, você pode usar, e. reptyr .

    
por 08.03.2012 / 15:50
28

Minha solução favorita é usar tmux , você pode desanexar a sessão e reconectá-la a outro terminal.

Quando você desanexou da sessão anterior, você pode fechar o terminal com segurança; depois use tmux attach para voltar para a sessão, mesmo que você tenha se desconectado.

    
por 26.09.2012 / 02:42
21

Há também um pequeno utilitário chamado retty que permite reconectar programas em execução a outro terminal.

    
por 14.11.2010 / 21:22
19

Eu não o uso regularmente, mas neercs alega apoiar isso. É um programa semelhante a screen com diversos recursos sofisticados, como melhor gerenciamento de painéis, mas a principal coisa que ele oferece é a capacidade de importar um processo em um painel

    
por 13.11.2010 / 21:44
9

Se você quiser apenas pausar e reiniciar depois, use kill com STOP ou CONT signal.

Primeiro, descubra os processos PID com

$ ps aux

Em seguida, envie os sinais para o PID listado para o processo

$ kill -STOP <PID>

$ kill -CONT <PID>
    
por 20.02.2014 / 09:42
9

"injcode" da ThomasHabets parece ser exatamente o que eu preciso:

link

O programa injcode permite que código arbitrário seja injetado em uma execução processo, se você soube de antemão e estava correndo tela ou tmux

Do README:

Example 1: move irssi from one terminal to another

Maybe move it into a screen.

First start irssi in one terminal.

Run injcode in another terminal: $ injcode -m retty

Irssi should now be moved to the second terminal, including having a new controlling terminal.

    
por 01.04.2014 / 03:10
0

Isso funcionou para mim:

  1. bg do processo
  2. jobs -l encontra o número do processo
  3. tmux start gerenciador de janelas shell
  4. reptyr -L PROCESSNUMBER

reptyr ' -L foi necessário para que isso funcionasse:

-L Like '-l', but also redirect the child's stdio to the slave.

por causa desse erro:

$ reptyr 30622

[-] Unable to open the tty in the child.
Unable to attach to pid 30622: Permission denied

E com -L

$ reptyr -L 30622
Opened a new pty: /dev/pts/4
    
por 19.10.2017 / 14:12