No se puede volver a conectar a una sesión de pantalla después de que se haya cortado la conexión SSH

16

Anteriormente me he vuelto a conectar a una sesión de pantalla de larga duración con screen -dr control. Sin embargo, a veces este comando no se volverá a conectar a la pantalla y en su lugar se bloqueará para siempre (más de 10 minutos después de lo cual aborté). Esto solo ocurre cuando la conexión SSH se cae inesperadamente y no cuando la pantalla se desconecta correctamente Ctrl-A d. Otros interruptores, como screen -xo screen -D -RRque tampoco funcionan.

Esta publicación sugiere eliminar el PTY que contiene la sesión de pantalla, lo que hará que la pantalla complete su desconexión. Sin embargo, simplemente mata el shell desde el que screen -dr controlse llamó.

Por ejemplo:

$ 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

La publicación vinculada sugiere matar el bashproceso con PID 7109. Esto también matará el screen -dr controlproceso con PID 7387. Después, todavía no puedo conectarme a la pantalla.

El proceso SCREEN -S controlque inició la sesión de pantalla tiene initcomo padre el que obviamente no puedo matar.

¿Hay alguna manera de volver a adjuntar a la sesión de pantalla bloqueada?

Actualización: Esto sucede en CentOS 6.4 usando el kernel 2.6.32-358.6.1.el6.x86_64. Todos los shells son bash versión 4.1.2 (1) -release.

Viktor Rosenfeld
fuente
3
¿Qué screen -lsdice en esos casos "colgantes"? screen -d -r <session>significa "separar y recuperar", por lo que no haberlo separado de primera mano no debería importar. (Y por hacerlo a menudo, no ...)
mveroone
Intente ejecutar lsof en los procesos de la pantalla, vea si hay algo "atascado". Screen utiliza un socket Unix para comunicarse entre procesos, probablemente algo lo ha mantenido abierto. También asegúrese de que el socket no se haya eliminado o que su propiedad haya cambiado o algo así. En general, también debe incluir el sistema operativo y la versión que está utilizando, aunque no tengo nada en mente que sea dependiente del sistema operativo esta vez.
Dan Pritts
3
¿Estás haciendo ssh'ing a través de otro salto, por ejemplo, usando netcat como un comando proxy? En este caso, he tenido el problema de que la conexión ssh al primer cuadro cae, pero el comando proxy netcat mantiene abierta una 'segunda' conexión ssh. Sin embargo, el -d debería funcionar.
Jens Timmerman
Jens, tu consejo hizo el truco. De hecho, hice proxy a través de netcat y matarlo en el host intermedio me permitió volver a conectarlo a la pantalla.
Viktor Rosenfeld
¿Por qué querrías matar el proceso padre del comando de pantalla colgada? Desea eliminar el comando de pantalla adjunto en sí. # 7387 en tu caso.
Matthias Urlichs

Respuestas:

6

Creo que deberías intentarlo

screen -DR 

la próxima vez también: la invocación enojada (mayúscula) debería obligarlo a desconectar esa otra sesión que está realizando su salto de red intermedio.

pacifista
fuente
Intenté esto, no funciona. Matar al proxy netcat hace el truco.
Viktor Rosenfeld
Extraño. Debería. ¿Qué pasa en su lugar?
Matthias Urlichs
Todas las invocaciones adicionales de pantalla (-dr, -x, -DR) se cuelgan para siempre. Una vez que eliminé el proxy de netcat, estas invocaciones funcionan nuevamente.
Viktor Rosenfeld
1

Como lo sugirió Jens Timmerman, la razón principal de este extraño comportamiento fue que me estaba conectando al servidor remoto usando SSH ProxyCommand y ncat. Después de eliminar el ncaten la máquina intermedia, puedo volver a conectar a la sesión de pantalla.

Viktor Rosenfeld
fuente
-2

Si este es un problema frecuente, también podría considerar usar mosh como reemplazo de ssh:

http://mosh.mit.edu

Fred Concklin
fuente