Mova um programa iniciado na tela GNU para outro terminal

21

Quero encerrar uma instância do GNU screen, preservando o processo em execução dentro dele.

Então eu abri meu programa regular de emulador de terminal e executei a tela. Então eu usei essa instância de screenpara executar ./script_x.sh. Agora, por qualquer motivo, quero parar de usar, screenmas script_x.shainda não concluí sua tarefa e não estou disposto a perder meu progresso.

Posso manter vivo o processo ativo para continuar trabalhando nele dentro do meu emulador de terminal normal?

tjt263
fonte
14
Você realmente quer matar a tela ou quer se separar dela? A tela deve ser usada para executar um processo em segundo plano, para que você possa continuar em sua sessão normal; também permite que os aplicativos continuem em execução após o logout (por exemplo, desconecte sua sessão SSH). Você sempre pode se desconectar da tela, continuar em sua sessão normal e pegar de onde saiu na sessão de tela. Seu emulador de terminal não tem nada a ver com isso.
BlueCacti
Ou apenas crie outra tela dentro da screensessão.
chrylis
11
Esta pergunta cheira como o problema XY .
Chris Digital
7
@ tjt263 - você se arrepende de usar a tela em primeiro lugar, então o que você faria para manter o processo em execução se não tivesse usado a tela? Você ainda pode fazer o mesmo com o processo na tela, mas a tela tem a vantagem adicional de poder desanexá-lo e deixar seu processo sem interrupções.
21416 Johnny
@DigitalChris Pode fazer agora. Eu sinto que o título original foi provavelmente mais relevante. Existem três pontos distintos: eu estava executando um programa dentro screen. Eu queria parar de usar screen. Eu não queria parar o programa que estava sendo executado dentro screen. É isso aí. Não sei como esclarecer a situação ou expressá-la de maneira mais simples que isso.
tjt263

Respostas:

31

TLDR: Resposta prática: Não.

Resposta mais longa:

Em teoria você pode. Se você iniciou algo como nohup myprog &dentro da tela, ele continuará sendo executado. Ele ignorará um sinal de desligamento e não terá nenhuma entrada, mas em teoria você pode continuar trabalhando com ele.

Na prática, este não é o caso. Portanto, a menos que você queira anexar um depurador ao processo em execução e reescrever seus identificadores de arquivo, verifique se o processo manipula sinais -1 quando você fecha a tela ... então a resposta é não.

Se você estiver pronto para fazer isso, tenho um marcador em casa apontando para [SU] onde alguém fez exatamente isso . Salvo por grandiosidade, não porque é fácil e trivial de fazer.

Hennes
fonte
Observe que a pergunta foi editada em massa desde a sua resposta.
chrylis
A desconexão de um processo é bastante direta - é uma questão de definir grupos de processos (com disownou em um nível inferior) para que nenhum SIGHUPseja enviado quando o processo pai terminar. Reconectando i / o é outra coisa altogether-- que é onde o depurador entra.
alexis
Você não precisa nohupse você estiver em um shell de controle de trabalho (como bash, ksh, csh, zsh, ash, etc.). Se você ainda estiver usando um shell de controle que não seja de trabalho como o Bourne, shtalvez seja hora de atualizar.
chicks
23

Você pode tentar usar reptyrpara reconectar o aplicativo já em execução a um terminal diferente. No entanto, há alguns problemas com o processo de envio para segundo plano.

Acabei de testá-lo (iniciar htopno interior screen, reptyrem outro terminal, matar screen) e parecia funcionar bem. Ainda é uma solução realmente hacky, então não há garantias.

uma terra
fonte
11
Menos hacky do que usando gdb :)
Hennes
14

Sim (se "matar" não é realmente matar), é exatamente para isso que serve a tela. Você deve verificar o manual e tentar qual deles atende às suas necessidades:

C-a d
C-a C-d     (detach)      Detach screen from this terminal.

C-a D D     (pow_detach)  Detach and logout.

Então, você precisará das opções de tela de linha de comando -D / -d -R / -r, dependendo da sua escolha.

Gombai Sándor
fonte
11
Isso não responde à pergunta. O OP não deseja se desconectar da tela, eles querem encerrar o processo da tela.
Guntram Blohm
6
Sim, ele escreveu isso, mas não tenho certeza se ele perguntou o que queria.
Gombai Sándor 18/03/16
11
@GuntramBlohm Não está claro que o OP entenda como a tela funciona e esse é o efeito desejado mais provável.
chrylis
2
Você sabe que a tela não é um terminal diferente do xterm, mas uma camada (um pseudo terminal) que pode ser conectada ao seu terminal real (vterm, xterm, terminator, (m) rxvt, any) depois de desconectá-lo de qualquer outro terminal? E a tela é o que mantém o seu processo executando um processo iniciado dentro da tela (e funciona bem). Se você mata (mata mesmo) a tela, retira o tapete do seu processo ... simplesmente não vejo nenhuma boa razão para fazê-lo.
Gombai Sándor 19/03/16
11
@ GombaiSándor: Uma razão para querer fazer isso seria fazer o processo falar diretamente com um terminal para passar por recursos que a tela não conhece. Por exemplo, uma vez hackeei minha própria versão do xterm para fazer com que todas as teclas de função estranhas do meu teclado enviassem sequências de escape que incluíam o keyym X11 e o estado completo do modificador, em vez de tentar fingir que era um VT102 - e comecei a instalar combinações de teclas para eles no emacs. Essas seqüências não passariam pela tela ilesas.
Henning Makholm 19/03/16