Cómo recuperar un shell después de una desconexión

37

Estoy trabajando en una máquina remota CentOS 5.6 y mi red sigue cayendo. ¿Hay alguna forma de recuperar mis sesiones bloqueadas después de volver a conectarme?

EDITAR: estoy actualizando e instalando algo con yum y me preocupa que esto pueda ser un problema si los procesos continúan suspendidos en el medio de lo que sea que estén haciendo.

Jeff Schaller
fuente
66
tmux o pantalla.
sehe

Respuestas:

63

No hay forma, pero para evitar esto me gusta usar tmux. Comienzo tmux, comienzo la operación y sigo mi camino. Si regreso y encuentro que la conexión se ha interrumpido, todo lo que tengo que hacer es volver a conectar y escribir tmux attach.

Aquí hay un ejemplo.

$ tmux
$ make <something big>
......
Connection fails for some reason
Reconect

$ tmux ls
0: 1 windows (created Tue Aug 23 12:39:52 2011) [103x30]

$ tmux attach -t 0
Back in the tmux sesion
Braiam
fuente
no tengo tmux, y no se me permite instalar cosas que no están en mi lista de tareas ...
55
@sergio Mi corazón sangra :-)) Uso screen.
44
@sergio En un sistema Unix, prácticamente cualquier aplicación que no requiera permisos de root para ejecutarse puede instalarse en el directorio de inicio.
Kusalananda
35

Las recomendaciones para tmux y screen son buenas sugerencias. Implican la respuesta a su pregunta, pero en realidad no la declaran. La respuesta a la pregunta es: no hay manera. Si inicia sesión a través de ssh, el shell finaliza cuando se corta la conexión. La solución es iniciar sesión e iniciar inmediatamente un terminal virtual de algún tipo (como tmux). Cuando se corta la conexión, el shell en el que se encuentra finaliza, pero puede abrir un nuevo shell y volver a conectarse al terminal virtual (que está ejecutando el shell en el que realmente está haciendo su trabajo).

William Pursell
fuente
Okay. está claro ahora.
Suponiendo que el proceso yum todavía se ejecuta (no terminó inmediatamente cuando el shell obtuvo SIGHUP), reptyr o similar podría ser suficiente para recuperar el proceso o, en su defecto, obtener cualquier salida futura. Sin embargo, el shell generalmente terminaría al desconectarse.
Eroen
@Eroen ¿Quiere decir que, incluso cuando usa tmux, el sistema operativo finalizará el proceso tmux una vez que descubra que se ha perdido la conexión?
Dojo
@Dojo Cuando finalice la conexión, la instancia de tmux se detendrá, pero la sesión de tmux (y los shells que administra) permanecerán activos.
William Pursell
Si el usuario perdió la conexión con el servidor ssh remoto porque, por ejemplo, desconectó accidentalmente el cable RJ-45, creo que el servidor ssh aún mantiene esta sesión hasta un tiempo de espera predefinido (120 segundos, por ejemplo). Entonces, en este caso, ¿hay alguna forma de reanudar esta sesión que aún esté activa en el lado del servidor ssh dentro de los 120 segundos posteriores a la desconexión del cable?
Gab 是 好人
8

Como dijo William, la respuesta corta es no, no hay manera. Para evitar esto, puede usar el comando de pantalla antes de perder la conexión

Nicholas Smith
fuente
por lo que entiendo, tendría que haber iniciado yum con pantalla ... bueno, no lo hice. no puedo volver a ejecutar, dice que todavía se está usando y no quiero forzarlo a matarlo. ... ¿cómo puedo recuperar el control de la ejecución yum?
y byobu es un buen complemento para la pantalla, para que se inicie automáticamente en un agradable terminal gráfico launchpad.net/byobu
Hasta donde sé, no puede, a menos que haya alguna forma oculta de redirigir la salida del comando yum a su sesión de término actual, pero no puedo pensar en una fuera de mi cabeza.
Nicholas Smith el
Hay varias soluciones parciales para esto usando depuradores & c. para dar a un proceso un nuevo shell padre. Reptyr es uno, y una publicación de blog describe el problema, la solución y algunas otras implementaciones.
Eroen
3

No, no puede recuperar un shell después de una desconexión. En cambio, lo que puede hacer es asegurarse de que el comando que estaba ejecutando continúa ejecutándose después de la desconexión.

Para lograr esto, use los comandos "nohup" y "disown", que generalmente son comandos integrados en la mayoría de los shells, es decir, no necesita instalar nada. Sin embargo, esto solo funciona para comandos no interactivos.

Entonces, los pasos serían los siguientes:

  1. Inicie sesión en el servidor
  2. Ejecute su comando: "nohup sudo yum update &" (esto también registrará todos los resultados en el archivo nohup.out en su directorio actual)
  3. Ejecute "disown% 1"
  4. Siéntase libre de desconectarse en este momento o espere a ser desconectado :)

Cuando regrese al servidor, simplemente "tail nohup.out" para ver cómo está funcionando el comando.

zygis
fuente
¿No funcionaría esto bastante mal en el caso general ? Por ejemplo, con comandos que desean entrada en un momento u otro ... Para comandos completamente no interactivos, podría funcionar lo suficientemente bien y evitar la sobrecarga de (y posiblemente la necesidad de instalar) un multiplexor de terminales.
un CVn
Sí, esto solo funciona si sus comandos no quieren ninguna entrada del usuario, he actualizado la respuesta. En general, un multiplexor de terminales es el camino a seguir, pero se mencionó que no se permitió instalar herramientas adicionales.
zygis
Absolutamente, es una respuesta válida, ligeramente limitada en sus posibles casos de uso. Votado con la edición.
un CVn
3

Alguien agregó reptyr en un comentario en lugar de una respuesta, por lo que no puedo votarlo, pero parece una buena respuesta a la pregunta editada y funcionó muy bien en CentOS.

ver: https://github.com/nelhage/reptyr https://www.ostechnix.com/reptyr-move-running-process-new-terminal/

¿Hay alguna forma de recuperar mis sesiones bloqueadas después de volver a conectarme?

EDITAR: estoy actualizando e instalando algo con yum y me preocupa que esto pueda ser un problema si los procesos continúan suspendidos en el medio de lo que sea que estén haciendo.

Lo mismo, perdí la conexión remota a una sesión de actualización de yum. Así que busqué y encontré esta pregunta ... luego volví a conectar y usé la pantalla:

  1. reconectar ssh
  2. pantalla
  3. instalar reptyr según los enlaces anteriores
  4. ps -a | grep yum
  5. reptyr psid

y allí estoy en el aviso recuperado que estaba dando algunas horas antes.

Técnicamente, las respuestas son todas correctas, esto NO es una recuperación de una sesión bloqueada, es la repetición de un proceso huérfano a la sesión actual. Y muy útil también lo es ...

ingleno
fuente
1

Como muchas personas han sugerido screeny tmux, ambos admiten la funcionalidad básica, pero tienen características específicas distintas, por lo que no se puede decir que uno es superior a otro en todos los casos. Por ejemplo, solo tmux admite la división de ventanas , mientras que solo la pantalla GNU puede alternar el ajuste de línea larga con (Ctrl + ar). Vea una comparación más detallada aquí .

También existen herramientas específicas para solucionar este problema de ssh:

Autossh es un programa para iniciar una copia de ssh y monitorearla, reiniciándola según sea necesario en caso de que falle o deje de pasar el tráfico. La idea es de rstunnel.

Mosh es una aplicación de terminal remota que permite itinerancia, admite conectividad intermitente y proporciona eco local inteligente y edición de línea de las pulsaciones de teclas del usuario. Mosh es un reemplazo para SSH. Es más robusto y receptivo, especialmente a través de Wi-Fi, celulares y enlaces de larga distancia.

Yaroslav Nikitenko
fuente
-1

Esto se puede hacer usando tmuxshell. Si se desconecta, la forma más rápida de volver a conectar una sesión es:

tmux a #0
cmcginty
fuente
Esto no agrega nada que la respuesta aceptada no diga. También supone que el usuario ya tiene una tmuxsesión en ejecución.
Kusalananda
2
Esto podría ser un comentario sobre esa respuesta que dice "puedes abreviar attachcomo a".
Jeff Schaller