tmux y screen: Multiplexar la terminal de GNU/Linux

Publicado por Diego Córdoba en

Hoy introduciremos dos herramientas: tmux y screen, para multiplexar la terminal de GNU/Linux para ejecutar varias tareas al mismo tiempo.

Este contenido complementa el curso de Administración GNU/Linux por línea de comandos, tendiente a lograr la certificación LPIC-1.

En sistemas GNU/Linux con interfaz gráfica es muy simple abrir varios emuladores de terminal, o tabs dentro de los mismos, para realizar varias tareas: uno con un htop, otro ejecutando comandos, otro usando ffmpeg para codificar un video, otra ejecutando profanity para chatear con tus amigos en xmpp, otra con cmus para escuchar música, etc.

Video complementario en Youtube!

Ahora, cuando estamos administrando servidores remotos o instancias virtuales en la nube, lo más probable es que dispongamos de una sola terminal.

Entonces, ¿Cómo podemos, en este caso, ejecutar varias tareas a la vez? o mejor, ¿cómo podemos ejecutar varias sesiones de terminal en una sola?

Dos de las herramientas más comunes para realizar esto de multiplexar una terminal para ejecutar varias tareas son screen y tmux. Veamos cómo se usa cada una con ejemplos prácticos!

Multiplexar terminal con Screen

Esta utilidad generalmente no viene instalada en las distribuciones, pero podemos instalarla desde los repositorios de nuestra distro:

#Distros DEB
sudo apt install screen

#Distros RPM
sudo yum install screen

#ArchLinux
sudo pacman -S screen

Una vez instalado, el primer paso es ejecutar el comando screen. Obtendremos una pantalla de bienvenida, y si damos <enter> tendremos un prompt.

screen y tmux screen new

Aquí podemos ejecutar cualquier comando de GNU/Linux. Para verificar que estamos dentro de una sesión de screen podemos ejecutar el comando screen -ls:

screen -ls

En mi caso la sesión tiene el ID 214821. Este dato es importante para más adelante.

Realicemos un ejemplo práctico. Supongamos que queremos ejecutar el comando htop en nuestra terminal pero, a la vez que corre htop, necesitamos editar el archivo /etc/fstab.

Ahora que hemos creado una sesión de screen, en dicha sesión podemos ejecutar el comando htop, con lo cual veremos, obviamente, la salida de htop en modo interactivo.

Para correr otra sesión y poder, por ejemplo, editar el archivo /etc/fstab, debemos desasociar la terminal de la sesión de screen donde estamos ejecutando htop. Esto lo hacemos con la combinación de teclas «Ctrl+a+d«.

screen -ls

Obtendremos, como se ve en la captura, el prompt original de la terminal. En este momento el comando htop sigue ejecutándose en la sesión de screen, aunque no lo estemos viendo. Si listamos los screens veremos que ahora figura como Detached.

Aquí podemos editar o ejecutar cualquier otro comando, o incluso abrir otra sesión de screen tal cual lo hicimos antes. Supongamos que abrimos otra sesión de screen para editar el /etc/fstab con neovim, dado que esto nos permitirá seguir abriendo sesiones para diferentes cosas.

Al ejecutar el comando screen abriremos otra sesión, y podremos listar ambas:

screen 2

Ahora, la sesión marcada como Detached es la que está corriendo el comando htop, y la segunda, Attached, es donde estamos trabajando con nuestra shell.

Supongamos que editamos el archivo /etc/fstab en esta sesión:

screen attach

Ahora ya no podemos ejecutar otro comando, pero sí pedimos abandonar esta sesión y volver a nuestro prompt original, nuevamente con la combinación Ctrl+a+d. Igualmente, podemos listar las sesiones otra vez:

Ahora tenemos dos sesiones de screen, una corriendo el htop, y la otra corriendo el nvim editando el archivo.

Supongamos que deseamos «ver» cómo se está ejecutando htop, podemos hacerlo invocando a la sesión de screen mediante el modificador -r. En nuestro caso:

screen -r 214821

Esto nos mostrará el htop. Igualmente, podemos salir con Ctrl+a+d, e invocar al otro screen para seguir editado el archivo.

Al invocar al screen podemos usar solamente el ID, o el identificador completo. En mi caso, estoy usando ZSH, y al presionar TAB luego del -r me autocompleta las posibles opciones.

Para cerrar un screen, simplemente cerramos los comandos, y ejecutamos «exit«.

Veamos este ejemplo completo en un GIF (eliminé los screens, por lo que los IDs van a cambiar).

En la parte inferior de la pantalla pueden verse las teclas que voy presionando.

screen detach attach

Un truco, cuando tenemos un solo screen abierto, y nos hemos desasociado del mismo, para volver a entrar no es necesario invocar al parámetro -r pasando como argumento el ID del screen, podemos usar simplemente screen -x.

Screen posee también características de división de pantalla en paneles para ejecutar varias tareas, pero la verdad es que para eso prefiero utilizar tmux, una herramienta mucho más moderna y a la que me he acostumbrado más rápido.

Multiplexar terminal con Tmux

tmux es una herramienta mas moderna que screen, provee funcionalidades similares, con algunos agregados interesantes.

Al igual que screen, tmux no suele venir instalado en las distros, aunque podemos instalarlo utilizando los repositorios oficiales:

#Distros DEB
sudo apt install tmux

#Distros RPM
sudo yum install tmux

#ArchLinux
sudo pacman -S tmux

Una vez instalado, podemos empezar a utilizarlo simplemente ejecutando el comando tmux. Nuestra shell cambiará y agregará una línea de información debajo, como se ve a continuación:

screen y tmux tmux new

De manera similar a lo que hicimos con screen, tmux permite listar las sesiones activas usando tmux ls:

tmux ls

Podemos desasociar la terminal de la sesión actual de manera similar a lo que hacíamos con screen, sólo que en este caso la tecla de control por defecto es Ctrl+b. Así, para desasociar la sesión: Ctrl+b+d.

En mi caso he cambiado dicha tecla de control por Ctrl+Space porque me resulta más cómoda (en otro post hablaremos sobre las configuraciones de tmux).

Al desasociar la sesión volveremos a nuestro prompt, donde podremos correr una nueva sesión usando el comando tmux o tmux new.

tmux detach

De manera similar a screen, cuando desasociamos la terminal de una sesión tmux, podemos volver a asociarla usando el comando attach-session -tnn, donde nn representa el número de sesión tmux. Veamos el siguiente ejemplo práctico.

tmux detach attach

Dividiendo la ventana con tmux

Finalmente, veamos algunas características interesantes de tmux, muy útiles, como la división de la ventana.

Las combinaciones por default para la división de paneles, y para moverse entre ellos son (siempre, presionando previamente la tecla de control, por default, Ctrl+b):

%Dividir la ventana en paneles horizontales.
«Dividir la ventana en paneles verticales.
OMoverse al siguiente panel
<flechas de cursor>Moverse al panel al que apunta el cursor.

Veamos el siguiente ejemplo del uso de paneles dentro de una sesión de tmux:

tmux pane

En mi configuración particular he cambiado el caracter " por v (para vertical), % por h (para horizontal), sí, tmux es muy configurable! 🙂

Todo esto, recordemos, dentro de una sesión, por lo que podríamos tener varias sesiones con varios paneles cada una… veamos este ejemplo combinado:

tmux pane y detach

Finalmente, para cerrar una sesión de tmux podemos usar exit, o la tecla de control combinada con &, por ejemplo, Ctrl+b+&.

Finalmente, les comparto el video que grabé en mi canal de youtube compartiendo un tutorial básico de Tmux:

Conclusiones: tmux y screen

Y hemos llegado al final!

¿Cuándo usar estas herramientas?

Yo inicialmente usaba el comando screen, pero luego descubrí tmux y migré a esta nueva herramienta.

En general le doy dos grandes usos. Por un lado, para dividir paneles y poder ejecutar varias tareas al mismo tiempo.

Por otro, cuando la conexión a Internet es inestable, y necesito realizar tareas en servidores remotos, suelo conectar con ssh al servidor, luego correr una sesión de tmux y trabajar ahí. De esta forma, si la conexión se corta y se me cierra la terminal ssh puedo conectar nuevamente, y re-asociar la sesión tmux que tenía previamente andando, para continuar por donde estaba.

Como siempre, si quieren ampliar por su cuenta sobre estas dos herramientas, no tienen mas que ir a las páginas de manual:

tmux puede ser configurado al detalle para adaptarse a nuestra comodidad. Los parámetros que permite son muchos, por lo que en una futura entrada nos adentraremos en estos detalles.

Espero que les sea útil!

Hasta la próxima!


¿Preguntas? ¿Comentarios?

Si tenés dudas, o querés dejarnos tus comentarios y consultas, sumate al grupo de Telegram de la comunidad JuncoTIC!
¡Te esperamos!

Categorías: AplicacionesLinux

Diego Córdoba

- Ingeniero en Informática - Mg. Teleinformática - Tesis pendiente - Docente universitario - Investigador