Como mantener una sesión SSH activa aunque se pierda conexión en Ubuntu
Ciertas tareas críticas (como la migración del sistema operativo, las actualizaciones de aplicaciones críticas y otros procesos en los sistemas de producción) deben realizarse desde un terminal serie (consola virtual o remota). Sin embargo, hay momentos en los que no tenemos ninguna opción disponible y no tenemos más remedio que realizar tareas críticas desde nuestra sesión SSH. Pero, ¿qué ocurre si se corta el enlace o nuestra conexión y se cierra la sesión? Podemos correr el riesgo de dejar el sistema en un estado inconsistente o desconocido.
Afortunadamente, la herramienta tmux le permite crear sesiones persistentes para sobrevivir a cortes de red indefinidos. Es una herramienta muy útil para ejecutar algunas tareas críticas (al menos aquellas que no impliquen cambiar firewalls, configuraciones de red o dispositivos) sin riesgo.
Recientemente , al colaborar con una empresa local, me comentaban que algunas sesiones requieren estar abiertas ya que estan corriendo reportes y estos suelen tardar horas. Aqui , lo que se suele hacer es correr estos procesos desde la terminal serie o desde una estación de trabajo en la misma red.
tmux es un multiplexor de terminales: permite crear varias terminales accesibles y controladas desde una única pantalla. Pero además tiene la capacidad de ser removido de una pantalla (detach) y continuar corriendo en segundo plano, para luego ser reconectado a la pantalla. Muchos SysAdmins utilizan tmux a diario para mantener varias conexiones SSH a diferentes sistemas en una única vista. No es mi caso, personalmente me siento más cómodo con ventanas más grandes y múltiples tabs, en conjunto con scripts Bash y autenticación con clave pública. Sin embargo, esta capacidad de detach de una pantalla que tiene tmux puede resultar de extrema utilidad para no perder sesiones a causa de fallos de red.
A tal fin, es necesario instalar tmux en el servidor donde se ejecutarán tareas críticas:
sudo apt install tmux
Ejemplo de uso y funcionamiento:
Desde una terminal estoy conectado por SSH a un servidor. Procedo a ejecutar tmux en la sesión remota (es decir, lanzar tmux en el servidor a través de SSH):
tmux
Al lanzar tmux se observa una barra de estado en la parte inferior de la ventana, la cual muestra información de la sesión actual y es utilizada para ingresar comandos interactivos. En la sesión de tmux puedo ejecutar cualquier tipo de comandos como en una sesión Bash normal. A modo de ejemplo, lanzo ping cada 5 segundos para generar salida en la pantalla:
Ahora voy a emular un corte de red. Para ello, cierro la ventana para matar la conexión SSH sin salir de tmux:
La terminal me avisa que hay procesos en ejecución (el cliente SSH precisamente) y que al cerrarla serán terminados. Es precisamente lo que quiero: matar el cliente SSH.
Inmediatamente vuelvo a conectarme por SSH al servidor desde una nueva terminal:
Se observa que el proceso tmux quedó en ejecución, a pesar de haberse cerrado la sesión SSH. El comando tmux list-sessions permite listar las sesiones disponibles. Efectivamente se trata de la sesión que hemos dejado abierta previamente.
Para conectarse a una sesión existente, ejecutar el subcomando attach:
tmux attach
Al recuperar la sesión previa, se comprueba que se recupera no sólo la salida antes de perder la conexión, sino toda la salida que se generó mientras no estábamos conectados a la sesión. Efectivamente la sesión quedó “viva” en segundo plano y es posible acceder a toda su salida.
De esto se trata una sesión persistente, resguarda la salida y se mantiene activa a pesar de no tener una pantalla asociada a la misma.
De esta forma es posible aprovechar tmux para mantener sesiones activas a pesar de probables cortes de red o enlaces.