tmux y screen: Multiplexar la terminal de GNU/Linux
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.
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.
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
:
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/fsta
b, 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«.
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:
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:
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.
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:
De manera similar a lo que hicimos con screen
, tmux
permite listar las sesiones activas usando 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
.
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.
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. |
O | Moverse 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
:
En mi configuración particular he cambiado el caracter
"
porv
(para vertical),%
porh
(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:
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!