Usar GNU Screen para Adjuntar y Desadjuntar Sesiones de Consola
GNU Screen es un multiplexor de terminal que te permite crear, gestionar y reanudar de forma persistente múltiples sesiones de shell independientes desde una única conexión de terminal. Cuando desconectas una sesión de Screen, todos los procesos que se ejecutan dentro de ella continúan ejecutándose en segundo plano — sobreviviendo a desconexiones SSH, caídas de red y cierres de terminal — hasta que explícitamente te reconectes o termines la sesión.
Esta capacidad es indispensable para los administradores de sistemas que gestionan servidores remotos a través de SSH. Ya sea que estés compilando un código fuente extenso, ejecutando una migración de base de datos, monitoreando registros o ejecutando un trabajo de copia de seguridad de varias horas, Screen garantiza que el trabajo continúe independientemente de lo que le suceda a tu conexión de cliente.
Por qué GNU Screen sigue siendo relevante en la infraestructura moderna
Herramientas como `tmux` han ganado popularidad, pero GNU Screen sigue siendo omnipresente en entornos Linux empresariales, sistemas embebidos e infraestructura heredada. Se incluye como paquete predeterminado o casi predeterminado en la mayoría de las distribuciones de servidor, no requiere ninguna configuración para ser inmediatamente útil, y su modelo de persistencia de sesión es muy sólido. En un VPS o servidor dedicado donde el tiempo de actividad y la ejecución ininterrumpida de tareas son críticos, Screen suele ser el camino más rápido hacia una sesión persistente y confiable.
Ventajas operativas clave:
- Persistencia de sesión ante desconexiones — los procesos sobreviven a tiempos de espera de SSH e interrupciones de red
- Multiplexación de múltiples ventanas — ejecuta tareas en paralelo dentro de una única conexión SSH
- Bajo consumo de recursos — huella de CPU y memoria insignificante en comparación con alternativas basadas en GUI
- Gestión de sesiones mediante scripts — automatiza la creación de sesiones e inyección de comandos a través de scripts de shell
- Amplia compatibilidad — disponible en prácticamente cualquier sistema compatible con POSIX
GNU Screen vs. tmux: elegir el multiplexor adecuado
Ambas herramientas resuelven el mismo problema central, pero difieren significativamente en arquitectura, profundidad de configuración y ergonomía de scripting.
| Característica | GNU Screen | tmux |
|---|
| — | — | — |
|---|
| Disponibilidad predeterminada | Preinstalado en la mayoría de las distribuciones | Requiere instalación explícita |
|---|
| Archivo de configuración | `.screenrc` | `.tmux.conf` |
|---|
| División de paneles | Vertical y horizontal (limitado) | División completa de paneles con diseños |
|---|
| Scripting / automatización | Inyección de comandos `screen -X` | `tmux send-keys`, API enriquecida |
|---|
| Personalización de la barra de estado | Básica | Altamente personalizable |
|---|
| Modo de copia | Similar a Vi, menos intuitivo | Modos Vi y Emacs, integración con portapapeles |
|---|
| Compartir sesión | Compatible mediante el indicador `-x` | Compatible de forma nativa |
|---|
| Curva de aprendizaje | Baja | Moderada |
|---|
| Caso de uso ideal | Sesiones persistentes rápidas, sistemas heredados | Flujos de trabajo complejos con múltiples paneles |
|---|
Para la persistencia de sesiones sencilla en un servidor remoto — el caso de uso más común para administradores de sistemas — la simplicidad de Screen es una característica, no una limitación.
Instalación de GNU Screen
Antes de continuar, verifica si Screen ya está presente:
“`bash
screen –version
“`
Si no está instalado, utiliza el gestor de paquetes apropiado para tu distribución.
Debian / Ubuntu:
“`bash
sudo apt-get update && sudo apt-get install screen
“`
CentOS / RHEL 7 y anteriores:
“`bash
sudo yum install screen
“`
CentOS Stream / RHEL 8+ / Fedora:
“`bash
sudo dnf install screen
“`
Arch Linux:
“`bash
sudo pacman -S screen
“`
macOS (mediante Homebrew):
“`bash
brew install screen
“`
Verificación:
“`bash
screen –version
Output example: Screen version 4.09.00 (GNU) 30-Jan-22
“`
Iniciar una sesión de Screen
Inicio básico de sesión
“`bash
screen
“`
Esto te lleva a una nueva sesión de Screen con un prompt de shell estándar. A la sesión se le asigna automáticamente un identificador numérico basado en el PID.
Sesiones con nombre (muy recomendado)
Asigna siempre un nombre a tus sesiones en entornos de producción. Las sesiones con nombre son mucho más fáciles de identificar y reconectar cuando tienes múltiples trabajos concurrentes en ejecución:
“`bash
screen -S session_name
“`
Ejemplos prácticos:
“`bash
screen -S db_migration
screen -S log_monitor
screen -S build_job
“`
El uso de nombres es especialmente valioso cuando se gestionan múltiples cargas de trabajo en un servidor dedicado donde varios administradores pueden estar trabajando simultáneamente.
Iniciar una sesión con un comando
Puedes iniciar Screen y ejecutar inmediatamente un comando dentro de él:
“`bash
screen -S backup_job bash -c 'rsync -avz /data/ /backup/ && echo "Done"'
“`
La sesión persiste incluso después de que el comando finaliza, lo que te permite reconectarte e inspeccionar la salida.
Desconectarse de una sesión de Screen
Desconectarse es el flujo de trabajo principal que hace valioso a Screen. Suspende tu vista de la sesión mientras deja todo lo que hay dentro de ella en ejecución.
Atajo de teclado:
“`
Ctrl + A, then D
“`
- `Ctrl + A` — el prefijo de comando de Screen (todos los comandos de Screen comienzan con este)
- `D` — desconectar
Después de desconectarte, tu terminal regresa al prompt de shell original. La sesión de Screen y todos los procesos dentro de ella continúan ejecutándose en segundo plano. Verás un mensaje de confirmación:
“`
[detached from 12345.db_migration]
“`
Error crítico a evitar: No confundas desconectarte (`Ctrl+A, D`) con cerrar una ventana (`Ctrl+A, K` elimina la ventana actual). Cerrar todas las ventanas termina la sesión por completo.
Listar sesiones de Screen activas
“`bash
screen -ls
“`
Ejemplo de salida:
“`
There are screens on:
18423.db_migration (Detached)
18891.log_monitor (Attached)
19204.build_job (Detached)
3 Sockets in /var/run/screen/S-root.
“`
Los indicadores de estado son significativos:
- Detached — ningún terminal está conectado actualmente; la sesión se está ejecutando en segundo plano
- Attached — un terminal está conectado activamente a esta sesión
- Dead — el proceso de la sesión ha finalizado pero el archivo de socket no ha sido limpiado (usa `screen -wipe` para eliminar sesiones muertas)
Reconectarse a una sesión de Screen
Reconectarse por nombre de sesión
“`bash
screen -r db_migration
“`
Reconectarse por PID de sesión
“`bash
screen -r 18423
“`
Reconectarse cuando solo existe una sesión
“`bash
screen -r
“`
Screen se reconectará automáticamente si solo hay una sesión desconectada.
Forzar la reconexión a una sesión ya conectada
Este es el escenario que sorprende a muchos administradores. Si tu conexión SSH se cayó de forma abrupta, la sesión puede seguir apareciendo como Attached porque el terminal anterior no se desconectó correctamente. Intentar un `screen -r` estándar fallará con:
“`
There is a screen on: 18891.log_monitor (Attached)
There is no screen to be resumed.
“`
La solución es desconectar forzosamente el terminal antiguo y reconectarse inmediatamente:
“`bash
screen -d -r log_monitor
“`
- `-d` — desconecta remotamente la sesión del terminal que la tiene actualmente
- `-r` — reconecta al terminal actual
Alternativa con ID de sesión explícito:
“`bash
screen -d -r 18891
“`
Este es uno de los comandos de Screen más importantes operativamente y se necesita con frecuencia después de desconexiones inesperadas de un VPS.
Gestión de múltiples ventanas dentro de una sesión
Una de las características más potentes de Screen es la capacidad de ejecutar múltiples ventanas independientes (terminales virtuales) dentro de una única sesión. Cada ventana mantiene su propio shell, árbol de procesos y búfer de desplazamiento.
Crear una nueva ventana
“`
Ctrl + A, then C
“`
Navegar entre ventanas
| Acción | Atajo |
|---|
| — | — |
|---|
| Ventana siguiente | `Ctrl + A, N` |
|---|
| Ventana anterior | `Ctrl + A, P` |
|---|
| Ir a ventana por número | `Ctrl + A, [0-9]` |
|---|
| Lista interactiva de ventanas | `Ctrl + A, "` |
|---|
| Última ventana activa | `Ctrl + A, Ctrl + A` |
|---|
Nombrar una ventana
“`
Ctrl + A, then A
“`
Se te pedirá que introduzcas un nombre para la ventana actual. Las ventanas con nombre aparecen en la lista de ventanas y en la barra de estado, lo que facilita significativamente la navegación cuando se ejecutan cinco o más tareas en paralelo.
Cerrar una ventana
Escribe `exit` en el shell, o presiona `Ctrl + D`. Cuando se cierra la última ventana de una sesión, la propia sesión de Screen termina.
Para cerrar forzosamente la ventana actual sin salir del shell:
“`
Ctrl + A, then K
“`
Dividir la pantalla (regiones)
GNU Screen admite la división básica de terminal, que es menos flexible que tmux pero funcional para la monitorización en paralelo.
Dividir horizontalmente (arriba/abajo):
“`
Ctrl + A, then S
“`
Dividir verticalmente (izquierda/derecha):
“`
Ctrl + A, then |
“`
Mover el foco a la siguiente región:
“`
Ctrl + A, then Tab
“`
Eliminar la región actual (sin cerrar la ventana):
“`
Ctrl + A, then X
“`
Eliminar todas las regiones excepto la actual:
“`
Ctrl + A, then Q
“`
Después de dividir, cada región está inicialmente vacía. Navega a una región con `Tab` y luego abre una ventana en ella usando `Ctrl + A, N` o `Ctrl + A, "`.
Compartir una sesión de Screen entre múltiples usuarios
Screen admite el uso compartido de sesiones entre varios usuarios, lo que es útil para la depuración colaborativa o la administración en pareja. Esto requiere que Screen esté instalado con permisos setuid.
Habilitar el modo multiusuario dentro de una sesión:
“`
Ctrl + A, then :multiuser on
“`
Conceder acceso a otro usuario:
“`
Ctrl + A, then :acladd username
“`
El otro usuario puede entonces conectarse a tu sesión:
“`bash
screen -x your_username/session_name
“`
Nota de seguridad: Las sesiones de Screen multiusuario requieren un control de acceso cuidadoso. Solo otorga permisos `acladd` a cuentas de confianza. En entornos de alojamiento compartido, esta función suele estar restringida.
Enviar comandos a una sesión desconectada
Una de las capacidades menos apreciadas de Screen es la posibilidad de inyectar comandos en una sesión en ejecución sin reconectarse:
“`bash
screen -S db_migration -X stuff "tail -f /var/log/app.logn"
“`
El comando `-X stuff` envía pulsaciones de teclas a la sesión como si se hubieran escrito. El `n` simula presionar Enter. Esto es extremadamente útil para scripts de automatización que necesitan interactuar con una sesión de Screen en ejecución.
Configurar Screen con .screenrc
El archivo `.screenrc` en tu directorio de inicio controla el comportamiento predeterminado de Screen. Una configuración mínima pero práctica:
“`bash
~/.screenrc
Disable the startup message
startup_message off
Set scrollback buffer to 10,000 lines
defscrollback 10000
Enable UTF-8
defutf8 on
Show a status bar at the bottom
hardstatus alwayslastline
hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %m-%d %{W}%c %{g}]'
Set default shell
shell -$SHELL
“`
La configuración `defscrollback 10000` es particularmente importante — el búfer de desplazamiento predeterminado es de solo 100 líneas, lo cual es insuficiente para monitorizar procesos de larga duración.
Referencia completa de comandos de Screen
| Comando / Atajo | Función |
|---|
| — | — |
|---|
| `screen` | Iniciar una nueva sesión sin nombre |
|---|
| `screen -S name` | Iniciar una sesión con nombre |
|---|
| `screen -ls` | Listar todas las sesiones |
|---|
| `screen -r name` | Reconectarse a una sesión desconectada |
|---|
| `screen -d -r name` | Forzar desconexión y reconexión |
|---|
| `screen -x name` | Conectarse a una sesión ya conectada (vista compartida) |
|---|
| `screen -wipe` | Eliminar sockets de sesiones muertas |
|---|
| `Ctrl + A, D` | Desconectarse de la sesión actual |
|---|
| `Ctrl + A, C` | Crear una nueva ventana |
|---|
| `Ctrl + A, N` | Ventana siguiente |
|---|
| `Ctrl + A, P` | Ventana anterior |
|---|
| `Ctrl + A, "` | Lista interactiva de ventanas |
|---|
| `Ctrl + A, A` | Renombrar la ventana actual |
|---|
| `Ctrl + A, K` | Cerrar la ventana actual |
|---|
| `Ctrl + A, S` | Dividir horizontalmente |
|---|
| `Ctrl + A, | ` | Dividir verticalmente |
|---|
| `Ctrl + A, Tab` | Mover a la siguiente región |
|---|
| `Ctrl + A, Q` | Eliminar todas las regiones excepto la actual |
|---|
| `Ctrl + A, [` | Entrar en modo de copia/desplazamiento |
|---|
| `Ctrl + A, ?` | Mostrar todos los atajos de teclado |
|---|
| `Ctrl + A, :quit` | Terminar la sesión completa |
|---|
Registrar la salida de una sesión de Screen
Screen puede registrar todo lo que se imprime en una ventana en un archivo — invaluable para auditar trabajos de larga duración:
Activar o desactivar el registro para la ventana actual:
“`
Ctrl + A, then H
“`
Esto crea un archivo llamado `screenlog.N` (donde N es el número de ventana) en el directorio actual. También puedes habilitar el registro desde la línea de comandos al iniciar una sesión:
“`bash
screen -L -S monitored_job
“`
O especificar un archivo de registro personalizado en `.screenrc`:
“`bash
logfile /var/log/screen/session_%t_%Y%m%d.log
“`
Casos de uso prácticos en servidores remotos
Migraciones de bases de datos de larga duración: Inicia una migración dentro de una sesión de Screen con nombre, desconéctate y monitoriza el progreso reconectándote periódicamente. Si la conexión SSH se cae, la migración continúa sin interrupciones.
Monitorización continua de registros: Ejecuta `tail -f` o `multitail` en una ventana de Screen. Desconéctate y reconéctate cuando necesites comprobar el estado actual.
Trabajos de compilación: Las compilaciones grandes de C++ o del kernel pueden tardar horas. Screen garantiza que la compilación se complete incluso si tu portátil pierde conectividad.
Procesos interactivos que no pueden ejecutarse en segundo plano: Algunas herramientas — CLIs de bases de datos, sesiones interactivas de Python, instaladores basados en texto — no pueden simplemente enviarse al segundo plano con `&`. Screen los envuelve en una sesión persistente de forma limpia.
Coordinación entre múltiples administradores: Usando `screen -x`, dos administradores pueden observar la misma sesión simultáneamente, lo que es útil durante la respuesta a incidentes en un servidor dedicado.
Si gestionas infraestructura web junto con sesiones persistentes, combinar Screen con un VPS con cPanel bien configurado te proporciona tanto una interfaz de gestión gráfica como capacidad completa de multiplexación de terminal. Para equipos que gestionan renovaciones de SSL y despliegues de certificados a través de la línea de comandos, los Certificados SSL combinados con scripts de automatización basados en Screen pueden hacer que el proceso sea completamente desatendido.
Errores comunes y cómo evitarlos
Acumulación de sesiones huérfanas: Los administradores frecuentemente olvidan terminar las sesiones después de que los trabajos se completan. Ejecuta `screen -ls` regularmente y usa `screen -wipe` para limpiar sockets muertos. Termina las sesiones inactivas con `screen -S session_name -X quit`.
Búfer de desplazamiento demasiado pequeño: El búfer predeterminado de 100 líneas significa que pierdes el historial de salida rápidamente. Establece siempre `defscrollback 10000` o superior en `.screenrc`.
Sesiones de Screen anidadas: Si te conectas por SSH desde dentro de una sesión de Screen e inicias otra sesión de Screen en el host remoto, los comandos `Ctrl + A` serán capturados por la sesión exterior. Usa `Ctrl + A, A` para enviar un `Ctrl + A` literal a la sesión interior, o usa `Ctrl + A, :sessionname` para diferenciarlas.
Sesión que permanece como Attached tras la desconexión: Una conexión SSH caída puede dejar una sesión en estado Attached. Usa siempre `screen -d -r` en lugar del simple `screen -r` al reconectarte después de una desconexión inesperada.
Problemas de configuración regional y codificación: Si ves caracteres ilegibles, asegúrate de que tu terminal y Screen usen UTF-8. Añade `defutf8 on` a `.screenrc` y verifica que tu variable de entorno `LANG` esté configurada con una configuración regional UTF-8 (por ejemplo, `en_US.UTF-8`).
Matriz de decisión: cuándo usar Screen
| Escenario | ¿Usar Screen? | Notas |
|---|
| — | — | — |
|---|
| Proceso remoto de larga duración | Sí | Caso de uso principal |
|---|
| Comando SSH puntual y rápido | No | La sobrecarga no está justificada |
|---|
| Flujo de trabajo de terminal con múltiples paneles | Quizás | Considera tmux para diseños complejos |
|---|
| Sesión de depuración compartida | Sí | Usa `-x` para vista compartida |
|---|
| Script automatizado sin interacción | No | Usa `nohup` o servicio `systemd` |
|---|
| Proceso interactivo que no puede ejecutarse como demonio | Sí | Screen es ideal |
|---|
| Panel de monitorización persistente | Sí | Combina con ventanas con nombre y registro |
|---|
Lista de verificación de puntos clave técnicos
- Asigna siempre un nombre a las sesiones con `screen -S descriptive_name` — las sesiones sin nombre se vuelven inmanejables a escala
- Establece `defscrollback 10000` en `.screenrc` antes de necesitarlo, no después de perder la salida
- Usa `screen -d -r` como tu comando de reconexión predeterminado para gestionar tanto los estados Attached como Detached sin tener que pensar
- Habilita el registro de sesión con `screen -L` para cualquier trabajo cuya salida puedas necesitar auditar más adelante
- Ejecuta `screen -wipe` periódicamente para eliminar sockets de sesiones muertas y mantener la salida de `screen -ls` legible
- Inyecta comandos en sesiones desconectadas con `screen -X stuff` para automatizar la interacción sin reconectarte
- En entornos con múltiples administradores, configura `.screenrc` con `multiuser on` y ACLs explícitas en lugar de depender del acceso root compartido
- Prueba tu configuración de `.screenrc` en un sistema que no sea de producción antes de desplegarlo en infraestructura crítica
Preguntas frecuentes
¿Qué ocurre con una sesión de Screen si el servidor se reinicia?
Todas las sesiones de Screen se pierden al reiniciar. Las sesiones de Screen son procesos que se ejecutan en memoria — no sobreviven a un reinicio del sistema. Para servicios verdaderamente persistentes, usa archivos de unidad `systemd` o scripts de inicio. Screen es para la persistencia de sesiones interactivas ante desconexiones, no ante reinicios.
¿Puedo usar Screen en una cuenta de alojamiento compartido?
Los entornos de alojamiento web compartido estándar suelen restringir el acceso SSH y es posible que no tengan Screen instalado o accesible. Screen es más efectivo en entornos VPS o de servidor dedicado donde tienes acceso completo al shell y privilegios de root o sudo.
¿Cuál es la diferencia entre `screen -r` y `screen -x`?
`screen -r` se reconecta a una sesión desconectada, dándote acceso exclusivo. `screen -x` se conecta a una sesión que ya está conectada, creando una vista compartida donde múltiples terminales ven la misma sesión simultáneamente — útil para la resolución colaborativa de problemas.
¿Cómo puedo desplazarme hacia arriba en una sesión de Screen para ver la salida anterior?
Entra en el modo de copia/desplazamiento con `Ctrl + A, [`. Usa las teclas de flecha o Re Pág/Av Pág para navegar. Presiona `Escape` o `Q` para salir del modo de copia. Asegúrate de que tu búfer de desplazamiento sea lo suficientemente grande configurando `defscrollback` en `.screenrc`.
¿GNU Screen sigue siendo mantenido activamente?
Sí. GNU Screen se mantiene activamente bajo el Proyecto GNU. La versión 4.9.x fue lanzada en 2022. Aunque no recibe el rápido desarrollo de nuevas funciones que tiene tmux, recibe parches de seguridad y correcciones de errores, lo que lo hace confiable para uso en producción en infraestructura de servidores de larga duración.
