Não é possível reconectar a uma sessão de tela após a queda da conexão SSH

16

Eu já havia reconectado anteriormente a uma sessão de tela de execução longa com screen -dr control. No entanto, às vezes, esse comando não é reconectado à tela e, em vez disso, é interrompido para sempre (mais de 10 minutos após o qual eu abortei). Isso acontece apenas quando a conexão SSH é interrompida inesperadamente e não quando a tela é desconectada corretamente Ctrl-A d. Outras opções, como screen -xou screen -D -RRtambém não funcionam.

Esta postagem sugere eliminar o PTY que mantém a sessão de tela, o que fará com que a tela conclua sua desconexão. No entanto, simplesmente mata o shell do qual screen -dr controlfoi chamado.

Por exemplo:

$ ps -ef | grep control | grep -v grep
nomad     7387  7109  0 13:05 pts/50   00:00:00 screen -dr control
nomad    15299     1  0 Nov27 ?        00:13:47 SCREEN -S control

$ ps -ef | grep bash | grep 'pts/50'
nomad     7109  7108  0 12:49 pts/50   00:00:00 -bash

A postagem vinculada sugere que o bashprocesso seja interrompido com o PID 7109. Isso também matará o screen -dr controlprocesso com o PID 7387. Depois, ainda não consigo conectar-me à tela.

O processo SCREEN -S controlque iniciou a sessão de tela tem initcomo pai o qual eu obviamente não posso matar.

Existe uma maneira de reconectar à sessão de tela travada?

Atualização: Isso acontece no CentOS 6.4 usando o kernel 2.6.32-358.6.1.el6.x86_64. Os shells são todos lançados na versão 4.1.2 (1) do bash.

Viktor Rosenfeld
fonte
3
O que screen -lsdiz nesses casos "pendurados"? screen -d -r <session>significa "desanexar e recuperar", portanto, não o desanexar em primeira mão não deve importar. (E para fazê-lo muitas vezes, isso não acontece ...)
mveroone
Tente executar lsof nos processos da tela, veja se há algo "preso". A tela usa um soquete unix para se comunicar entre processos, provavelmente algo o manteve aberto. Verifique também se o soquete não foi excluído ou se sua propriedade foi alterada ou algo assim. Em geral, você também deve incluir o SO e a versão que está usando, embora não tenha em mente nada em particular que seja dependente do SO desta vez.
Dan Pritts
3
Você está executando outro salto, por exemplo, usando o netcat como um comando proxy? Nesse caso, tive o problema de queda da conexão ssh com a primeira caixa, mas o comando netcat proxy mantém uma 'segunda' conexão ssh aberta. o -d deve funcionar no entanto.
Jens Timmerman
Jens, seu conselho fez o truque. Na verdade, eu fiz proxy através do netcat e matá-lo no host intermediário me permitiu recolocar na tela.
Viktor Rosenfeld
Por que você deseja matar o processo pai do comando de tela travada? Você quer matar o próprio comando de tela anexa. # 7387 no seu caso.
Matthias Urlichs

Respostas:

6

Eu acho que você deveria tentar

screen -DR 

da próxima vez também - a chamada com raiva (maiúscula) deve forçá-lo a desconectar a outra sessão realizada pelo seu netcat hop intermediário.

pacifista
fonte
Eu tentei isso, não funciona. Matar o proxy netcat faz o truque.
Viktor Rosenfeld
Estranho. Deveria. O que acontece em vez disso?
Matthias Urlichs
Todas as outras invocações de tela (-dr, -x, -DR) ficam para sempre. Depois de matar o proxy netcat, essas invocações funcionam novamente.
Viktor Rosenfeld
1

Conforme sugerido por Jens Timmerman, a razão final desse comportamento estranho foi que eu estava me conectando ao servidor remoto usando SSH ProxyCommand e ncat. Depois de matar ncato computador na máquina intermediária, consigo reconectar à sessão de tela.

Viktor Rosenfeld
fonte
-2

Se esse é um problema frequente, você também pode considerar o uso do mosh como um substituto do ssh:

http://mosh.mit.edu

Fred Concklin
fonte