Eu tenho um programa em execução em um shell SSH. Quero pausá-lo e poder interromper sua execução quando voltar.
Uma maneira que pensei em fazer isso foi transferir sua propriedade para um shell de tela, mantendo-o funcionando lá.
Existe uma maneira diferente de proceder?
Respostas:
Usar o GNU
screen
é sua melhor aposta.Iniciar a tela em execução quando você entra pela primeira vez - eu corro
screen -D -R
, execute seu comando e desconecte ou suspenda-oCTRL-Z
e desconecte-o da tela pressionandoCTRL-A
entãoD
.Quando você fizer login novamente na máquina, reconecte executando
screen -D -R
. Você estará no mesmo shell de antes. Você pode executarjobs
para ver o processo suspenso, se o fez, e executar%1
(ou o respectivo número da tarefa) para o primeiro plano novamente.fonte
Você pode revogar a "propriedade" do programa a partir do shell com o
disown
built-in:No entanto, isso diz apenas ao shell para não enviar um
SIGHUP
sinal ao programa quando o shell sair. O programa reterá qualquer conexão que tenha com o terminal, geralmente como fluxos de entrada, saída e erro padrão. Não há como reconectá-las a outro terminal. (A tela funciona emulando um terminal para cada janela, para que os programas sejam anexados à janela da tela.)É possível reconectar os descritores de arquivo a um arquivo diferente, anexando o programa em um depurador (por exemplo, usando
ptrace
) e fazendo-o chamaropen
,dup
eclose
. Existem algumas ferramentas que fazem isso; esse é um processo complicado e, às vezes, eles interrompem o processo. As possibilidades incluem (links coletados das respostas para Como posso negar um processo em execução e associá-lo a um novo shell de tela? E Posso nohup / rastrear um processo já iniciado? ):fonte
disown
remove o processo da lista de controle de tarefas.disown -h
?fg
oukill
ver, e veja se termina por conta própria.bzcat a.bz2 | grep text
)? Man forreptyr
diz que ele não suporta mover os processos com crianças.Para mover um processo entre terminais ou reconectar um renegado, você pode usar, por exemplo, reptyr .
fonte
screen
resposta aceita seja obviamente ideal, na verdade ela não responde à pergunta, que solicita especificamente uma maneira de mover um processo em execução no momentoscreen
. Veja também esta resposta: serverfault.com/a/284795Minha solução favorita é usar
tmux
, você pode desanexar a sessão e reconectá-la em outro terminal.Quando você se desconectou da sessão anterior, pode fechar o terminal com segurança; use mais tarde
tmux attach
para voltar à sessão, mesmo se você tiver desconectado.fonte
Há também um pequeno utilitário chamado retty que permite anexar programas em execução a outro terminal.
fonte
Eu não o uso regularmente, mas a neercs afirma apoiar isso. É um
screen
programa parecido com diversos recursos sofisticados, como melhor gerenciamento de painéis, mas o principal que ele oferece é a capacidade de importar um processo para um painelfonte
ptrace
), mas não apenas manipula os descritores de arquivo, mas bifurca o processo. É capaz de agarrarfind /
, mas travou uma festa interativa.Se você quiser apenas fazer uma pausa e reiniciar depois, pode usar
kill
comSTOP
ouCONT
sinalizar.Em primeiro lugar, descubra os processos PID com
Em seguida, envie os sinais para o PID listado no processo
fonte
"injcode" do ThomasHabets parece ser exatamente o que eu preciso:
https://github.com/ThomasHabets/injcode
O programa injcode permite que um código arbitrário seja injetado em um processo em execução, você sabia ou não de antemão e estava executando o screen ou tmux
No README:
fonte
Isso funcionou para mim:
bg
o processojobs -l
encontre o número do processotmux
iniciar gerenciador de janelas shellreptyr -L PROCESSNUMBER
reptyr
's-L
foi necessário chegar a este trabalho:-L Like '-l', but also redirect the child's stdio to the slave.
devido a este erro:
E com -L
fonte