La guía completa de comandos GNU Screen en Linux
GNU Screen es un multiplexor de terminal que te permite crear, gestionar y mantener múltiples sesiones de shell desde una sola ventana de terminal. Cuando te desconectas de una sesión de Screen, todos los procesos que se ejecutan dentro de ella continúan ejecutándose — sobreviviendo a desconexiones SSH, caídas de red y cierres de terminal — y permanecen completamente accesibles en el momento en que te reconectas.
Para cualquier persona que gestione servidores remotos a través de SSH, esta única capacidad elimina toda una clase de riesgo operativo: una conexión interrumpida ya no mata una migración de base de datos en curso, un trabajo de compilación de varias horas, o un proceso de monitoreo de registros en vivo.
Por qué GNU Screen sigue siendo relevante en la administración moderna de Linux
Herramientas como tmux han ganado popularidad, pero Screen viene como paquete predeterminado o casi predeterminado en prácticamente todas las distribuciones Linux empresariales e imágenes de servidor mínimas. Cuando accedes por SSH a una máquina bare-metal o a una instancia de VPS Hosting recién aprovisionada, Screen casi siempre está disponible sin ninguna instalación adicional. Su bajo consumo de memoria y su conformidad con POSIX lo convierten en la opción pragmática en entornos restringidos o bloqueados.
Capacidades principales de un vistazo:
- Persistencia de sesión: Los procesos sobreviven a la desconexión del terminal, al tiempo de espera de SSH y a los fallos del lado del cliente
- Multiplexación de ventanas: Múltiples ventanas de shell independientes dentro de una sola sesión
- Compartición de sesión: Dos usuarios pueden conectarse a la misma sesión simultáneamente para depuración colaborativa
- Acceso a consola serie: Screen puede conectarse directamente a dispositivos `/dev/ttyS*` para la gestión de servidores fuera de banda
- Inicio programable: El archivo de configuración `.screenrc` permite entornos de múltiples ventanas totalmente automatizados al iniciar
GNU Screen vs. tmux: Elegir el multiplexor adecuado
Ambas herramientas resuelven el mismo problema central pero con diferentes filosofías de diseño. La tabla a continuación cubre las distinciones que importan en entornos de producción.
| 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 (horizontal/vertical) | Limitada (solo vertical mediante regiones) | División de paneles completa y flexible |
|---|
| Compartición de sesión | Multi-conexión nativa | Multi-conexión nativa |
|---|
| Scripting / automatización | Inyección de comandos `screen -X` | `tmux send-keys`, API enriquecida |
|---|
| Consumo de memoria | Muy bajo | Bajo |
|---|
| Soporte de dispositivos serie | Sí (`screen /dev/ttyS0`) | No |
|---|
| Personalización de barra de estado | Moderada (hardstatus) | Muy flexible |
|---|
| Modo de copia | Estilo vi | Estilo vi o emacs |
|---|
| Ecosistema de plugins | Ninguno | Activo (TPM) |
|---|
| Caso de uso ideal | Servidores mínimos, consolas serie, entornos heredados | Estaciones de trabajo de desarrolladores, diseños complejos |
|---|
Orientación práctica: En un Servidor Dedicado sin cabeza que ejecuta trabajos en segundo plano a largo plazo, la simplicidad y disponibilidad universal de Screen lo convierten en la opción de menor fricción. Para un desarrollador que necesita paneles divididos y una barra de estado enriquecida, tmux gana.
Instalación de GNU Screen
Screen viene preinstalado en la mayoría de las distribuciones. Verifícalo con:
“`bash
screen –version
“`
Si no está presente, instálalo usando el gestor de paquetes apropiado:
Debian / Ubuntu:
“`bash
sudo apt-get update && sudo apt-get install screen
“`
CentOS / RHEL 7:
“`bash
sudo yum install screen
“`
CentOS Stream / RHEL 8+ / AlmaLinux / Rocky Linux:
“`bash
sudo dnf install screen
“`
Fedora:
“`bash
sudo dnf install screen
“`
Arch Linux:
“`bash
sudo pacman -S screen
“`
Alpine Linux (común en contenedores):
“`bash
apk add screen
“`
Tras la instalación, no se requiere ningún demonio ni servicio. Screen opera completamente como un proceso en espacio de usuario.
Iniciar una sesión de Screen
Sesión básica
“`bash
screen
“`
Esto te lleva a una nueva sesión con un shell estándar. La interfaz es indistinguible de un terminal normal hasta que usas el prefijo de comando de Screen.
Sesión con nombre (recomendado)
“`bash
screen -S session_name
“`
Siempre nombra tus sesiones en producción. Las sesiones sin nombre se identifican solo por su PID, lo que hace que la reconexión sea propensa a errores cuando hay múltiples sesiones en ejecución.
Consejo sobre convención de nombres: Usa nombres descriptivos que reflejen la carga de trabajo — `screen -S db-migration`, `screen -S log-monitor`, `screen -S build-php82`. Esto resulta beneficioso cuando regresas a un servidor después de horas de ausencia.
Iniciar una sesión y ejecutar un comando inmediatamente
“`bash
screen -S backup-job bash -c 'rsync -avz /data/ user@remote:/backup/ && echo DONE'
“`
La sesión persiste incluso después de que el comando se completa, lo que te permite inspeccionar la salida más tarde.
Iniciar una sesión en modo desconectado
“`bash
screen -dmS headless-job ./long_running_script.sh
“`
Los indicadores `-dm` crean la sesión y la desconectan inmediatamente. Este es el patrón correcto para lanzar trabajos en segundo plano desde cron o scripts de despliegue — el proceso se ejecuta dentro de una sesión de Screen con nombre y recuperable sin requerir un terminal interactivo.
El prefijo de comando: Entendiendo Ctrl+A
Cada atajo de teclado de Screen comienza con la secuencia de escape `Ctrl+A`. Esta pulsación de tecla le indica a Screen que el siguiente carácter es un comando, no una entrada para el programa en ejecución. Entender este modelo es esencial antes de memorizar atajos individuales.
Si ejecutas un programa dentro de Screen que a su vez usa `Ctrl+A` (por ejemplo, algunos editores de texto o la biblioteca `readline`), puedes enviar un `Ctrl+A` literal al programa interno presionando `Ctrl+A` dos veces (`Ctrl+A, Ctrl+A`).
Desconectar y reconectar sesiones
Desconectarse de una sesión en ejecución
“`
Ctrl+A, D
“`
La sesión continúa ejecutándose en segundo plano. Eres devuelto al shell padre. Ningún proceso dentro de la sesión es interrumpido.
Listar todas las sesiones
“`bash
screen -ls
“`
Ejemplo de salida:
“`
There are screens on:
14231.db-migration (Detached)
14089.log-monitor (Attached)
13901.build-php82 (Detached)
3 Sockets in /var/run/screen/S-deploy.
“`
El estado `Attached` significa que otro terminal está actualmente conectado a esa sesión. `Detached` significa que está en ejecución pero ningún terminal está conectado.
Reconectarse a una sesión específica
“`bash
screen -r db-migration
“`
O por PID:
“`bash
screen -r 14231
“`
Forzar la conexión a una sesión ya conectada
Si una sesión muestra `Attached` pero necesitas tomarla (por ejemplo, después de que una conexión SSH obsoleta la dejó bloqueada):
“`bash
screen -d -r log-monitor
“`
El indicador `-d` desconecta forzosamente la otra conexión antes de reconectarte. Esta es una técnica de recuperación crítica cuando una sesión SSH anterior murió sin desconectarse limpiamente.
Multi-conexión: Dos usuarios en la misma sesión
“`bash
screen -x session_name
“`
Ambos terminales ven una salida idéntica en tiempo real. Esto es invaluable para la depuración en pareja o para guías de servidor con un colega — ambas partes observan e interactúan con el mismo shell.
Gestión de ventanas dentro de una sesión
Una sola sesión de Screen puede contener un número ilimitado de ventanas. Cada ventana es un shell (o proceso) independiente.
Crear una nueva ventana
“`
Ctrl+A, C
“`
Navegar entre ventanas
| Atajo | Acción |
|---|
| — | — |
|---|
| `Ctrl+A, N` | Ventana siguiente |
|---|
| `Ctrl+A, P` | Ventana anterior |
|---|
| `Ctrl+A, 0–9` | Saltar directamente a la ventana por número |
|---|
| `Ctrl+A, "` | Lista interactiva de todas las ventanas |
|---|
| `Ctrl+A, '` | Solicitud para ingresar número o nombre de ventana |
|---|
Renombrar una ventana
“`
Ctrl+A, A
“`
Escribe el nuevo nombre y presiona Enter. Los nombres de ventana significativos se muestran en la barra hardstatus, lo que hace que la navegación sea mucho más rápida en sesiones con muchas ventanas.
Cerrar una ventana
Escribe `exit` o presiona `Ctrl+D` en el shell de la ventana. Cuando se cierra la última ventana de una sesión, la sesión termina.
Dividir la pantalla en regiones
Screen admite dividir el terminal en múltiples regiones visibles, cada una mostrando una ventana diferente simultáneamente.
Dividir horizontalmente (arriba/abajo)
“`
Ctrl+A, S
“`
Dividir verticalmente (izquierda/derecha)
“`
Ctrl+A, |
“`
Nota: La división vertical requiere Screen 4.1.0 o posterior.
Moverse entre regiones
“`
Ctrl+A, Tab
“`
Asignar una ventana a una región
Después de mover el foco a una región, usa `Ctrl+A, "` para seleccionar qué ventana mostrar allí.
Eliminar una región
“`
Ctrl+A, X (remove current region)
Ctrl+A, Q (remove all regions except current)
“`
Distinción importante: Eliminar una región no cierra la ventana que se ejecuta dentro de ella. La ventana continúa ejecutándose; simplemente dejas de mostrarla en esa división.
Copiar y pegar (modo de desplazamiento)
Screen mantiene un búfer de desplazamiento para cada ventana. Para acceder a él:
“`
Ctrl+A, [
“`
Esto entra en el modo de copia. La navegación usa teclas de estilo vi:
- `h`, `j`, `k`, `l` — mover cursor
- `Ctrl+F` / `Ctrl+B` — página adelante / atrás
- `/` — buscar hacia adelante
- `?` — buscar hacia atrás
- `Space` — marcar inicio de selección
- `Space` (de nuevo) — marcar fin y copiar al búfer
Para pegar el texto copiado:
“`
Ctrl+A, ]
“`
El búfer de desplazamiento predeterminado es de 100 líneas. Para el monitoreo de registros del servidor, auméntalo significativamente en `.screenrc` (cubierto a continuación).
Bloquear una sesión de Screen
“`
Ctrl+A, X
“`
La sesión se bloquea inmediatamente y solicita tu contraseña de usuario Unix antes de permitir el acceso. Úsalo cuando te alejes de un terminal que está conectado a un servidor sensible — es más rápido que cerrar la conexión SSH y reconectarse.
Enviar comandos a una sesión sin conectarse
El indicador `-X` te permite inyectar comandos de Screen en una sesión en ejecución desde el exterior:
“`bash
screen -S db-migration -X stuff "tail -f /var/log/mysql/error.logn"
“`
El comando `stuff` envía pulsaciones de teclas a la ventana activa de la sesión con nombre. El `n` simula presionar Enter. Esta técnica se usa en scripts de automatización de despliegue para interactuar con sesiones de Screen de larga duración sin requerir conexión humana.
Configurar Screen con .screenrc
El archivo `~/.screenrc` se lee al inicio y controla el comportamiento predeterminado de Screen. Un `.screenrc` bien elaborado transforma Screen de un multiplexor básico en un entorno genuinamente ergonómico.
Créalo o edítalo:
“`bash
nano ~/.screenrc
“`
Configuración recomendada de .screenrc para producción
“`bash
Disable the startup message
startup_message off
Set scrollback buffer to 10,000 lines (critical for log monitoring)
defscrollback 10000
Enable UTF-8
defutf8 on
Set default shell
shell -$SHELL
Visual bell instead of audible
vbell on
Hardstatus bar: shows hostname, window list, and current time
hardstatus on
hardstatus alwayslastline
hardstatus string '%{= kG}[ %{G}%H %{g}][%= %{= kw}%?%-Lw%?%{r}(%{W}%n*%f%t%?(%u)%?%{r})%{w}%?%+Lw%?%?%= %{g}][%{B} %d/%m %{W}%c %{g}]'
Bind F2 to create a new window
bindkey -k k2 screen
Change escape key to Ctrl+B (useful if Ctrl+A conflicts with other tools)
escape ^Bb
Auto-detach on hangup signal (critical for SSH session drops)
autodetach on
Disable flow control (prevents Ctrl+S from freezing the terminal)
defflow off
“`
La directiva `autodetach on` es innegociable para el uso con SSH. Sin ella, si tu conexión SSH cae inesperadamente (en lugar de que presiones `Ctrl+A, D`), Screen puede terminar la sesión en lugar de desconectarla. Con `autodetach on`, una señal SIGHUP (enviada cuando SSH se desconecta) desencadena una desconexión limpia en lugar de la terminación de la sesión.
`defflow off` previene la frustración común de presionar accidentalmente `Ctrl+S` y aparentemente congelar el terminal. Muchos administradores pierden minutos solucionando un terminal “congelado” que simplemente está en pausa de control de flujo XON/XOFF.
Casos de uso prácticos en producción
Ejecutar una migración de base de datos de forma segura
“`bash
screen -S db-migrate
Inside the session:
php artisan migrate –force 2>&1 | tee /var/log/migration-$(date +%F).log
Detach: Ctrl+A, D
Reattach later to check progress:
screen -r db-migrate
“`
Si la conexión SSH cae a mitad de la migración, el proceso continúa. Te reconectas y lo encuentras ya sea todavía en ejecución o completado con la salida completa preservada en el registro y el búfer de desplazamiento.
Monitorear múltiples archivos de registro simultáneamente
“`bash
screen -S monitoring
Window 0: nginx access log
tail -f /var/log/nginx/access.log
Ctrl+A, C — new window
Window 1: application error log
tail -f /var/log/app/error.log
Ctrl+A, C — new window
Window 2: system messages
journalctl -f
“`
Navega entre ventanas con `Ctrl+A, "` para ver qué registro está generando actividad.
Script de despliegue automatizado con Screen
“`bash
#!/bin/bash
screen -dmS deploy bash -c '
git pull origin main &&
composer install –no-dev &&
php artisan config:cache &&
systemctl reload php8.2-fpm &&
echo "Deployment complete at $(date)" >> /var/log/deploy.log
'
echo "Deployment started in background screen session 'deploy'"
echo "Monitor with: screen -r deploy"
“`
Este patrón es especialmente útil en un VPS con cPanel donde puedes estar gestionando múltiples despliegues de aplicaciones desde un único shell administrativo.
Acceso a consola serie
“`bash
screen /dev/ttyS0 115200
“`
Screen funciona también como emulador de terminal serie. Esta es la técnica estándar para acceder a la consola de un servidor físico, switch de red o dispositivo embebido a través de una conexión serie — sin requerir minicom o picocom.
Errores comunes y cómo evitarlos
Sesiones de Screen anidadas: Si accedes por SSH desde una sesión de Screen en la Máquina A a la Máquina B y comienzas Screen allí, ahora tienes dos capas de manejo de `Ctrl+A`. La sesión interna de Screen captura `Ctrl+A` antes de que la externa lo vea. Para enviar `Ctrl+A` a la sesión externa, presiona `Ctrl+A, Ctrl+A`. Para evitar confusiones, cambia la tecla de escape de la sesión interna en su `.screenrc` usando `escape ^Bb`.
Sesiones muertas que no se limpian: Si Screen falla o el host se reinicia de forma incorrecta, los archivos de socket pueden persistir en `/var/run/screen/` o `~/.screen/`, mostrando sesiones como `Dead`. Límpialos con:
“`bash
screen -wipe
“`
Sesión propiedad de root vs. usuario: Una sesión de Screen iniciada como root no puede ser reconectada por un usuario no root, y viceversa. Si ejecutas `sudo su` dentro de una sesión de Screen y luego te desconectas, reconéctate como root o mediante `sudo screen -r`.
Discrepancia de la variable `TERM`: Algunas aplicaciones dentro de Screen se comportan incorrectamente porque `TERM` está configurado como `screen` o `screen-256color` en lugar de `xterm-256color`. Si una aplicación TUI se renderiza incorrectamente, verifica con `echo $TERM` y anula en `.screenrc` con `term xterm-256color` si es necesario.
Agotamiento del búfer de desplazamiento: El desplazamiento predeterminado de 100 líneas es inadecuado para cualquier monitoreo serio de registros. Siempre establece `defscrollback 10000` o superior en `.screenrc` en servidores usados para administración activa.
Referencia rápida: Comandos esenciales de Screen
| Acción | Comando / Atajo |
|---|
| — | — |
|---|
| Iniciar nueva sesión | `screen` |
|---|
| Iniciar sesión con nombre | `screen -S name` |
|---|
| Iniciar sesión desconectada | `screen -dmS name` |
|---|
| Listar sesiones | `screen -ls` |
|---|
| Reconectar por nombre | `screen -r name` |
|---|
| Forzar reconexión | `screen -d -r name` |
|---|
| Multi-conexión | `screen -x name` |
|---|
| Desconectar | `Ctrl+A, D` |
|---|
| Nueva ventana | `Ctrl+A, C` |
|---|
| Ventana siguiente | `Ctrl+A, N` |
|---|
| Ventana anterior | `Ctrl+A, P` |
|---|
| Lista de ventanas | `Ctrl+A, "` |
|---|
| Renombrar ventana | `Ctrl+A, A` |
|---|
| Dividir horizontalmente | `Ctrl+A, S` |
|---|
| Dividir verticalmente | `Ctrl+A, | ` |
|---|
| Moverse entre regiones | `Ctrl+A, Tab` |
|---|
| Entrar en modo copia/desplazamiento | `Ctrl+A, [` |
|---|
| Pegar búfer | `Ctrl+A, ]` |
|---|
| Bloquear sesión | `Ctrl+A, X` |
|---|
| Cerrar ventana actual | `Ctrl+A, K` |
|---|
| Cerrar sesión completa | `Ctrl+A, ` |
|---|
| Enviar comando a sesión | `screen -S name -X stuff "cmdn"` |
|---|
| Limpiar sesiones muertas | `screen -wipe` |
|---|
Contexto de despliegue: Screen en entornos de hosting gestionado
Screen opera a nivel de shell, lo que lo hace compatible con cualquier entorno Linux donde tengas acceso SSH. Esto incluye servidores bare-metal, Servidores Dedicados e instancias estándar de VPS Hosting. No está disponible en entornos de hosting compartido donde el acceso SSH está restringido o ausente.
Para cargas de trabajo que implican procesamiento en segundo plano persistente — como inferencia de modelos acelerada por GPU, preprocesamiento de grandes conjuntos de datos o trabajos por lotes de larga duración — combinar Screen con un entorno de GPU Hosting te proporciona tanto los recursos computacionales como la persistencia de sesión necesaria para gestionar trabajos de varias horas de forma fiable.
Si tu infraestructura incluye servicios orientados a la web junto con procesamiento en segundo plano, combinar los trabajos de backend gestionados por Screen con Certificados SSL correctamente asegurados en tus endpoints públicos garantiza que toda la pila — tanto la capa de aplicación visible como el backend administrativo — opere con los controles de seguridad apropiados.
Matriz de decisión: Cuándo usar Screen
Usa Screen cuando:
- Necesitas persistencia de sesión en un servidor donde solo Screen está disponible
- Estás accediendo a una consola serie o dispositivo embebido
- Estás ejecutando un único proceso de larga duración y no necesitas paneles divididos
- Estás en un sistema mínimo basado en Alpine o BusyBox
- Necesitas compartir una sesión con otro administrador en tiempo real
Considera tmux en su lugar cuando:
- Requieres división de paneles horizontal y vertical flexible
- Quieres un ecosistema de plugins para mejoras de la barra de estado
- Estás construyendo un entorno de estación de trabajo de desarrollador con diseños complejos
- Tu equipo ha estandarizado la gestión de configuración de tmux
No uses ninguno (usa systemd o supervisor en su lugar) cuando:
- El objetivo es puramente ejecutar un servicio en segundo plano que deba sobrevivir a reinicios
- No necesitas acceso interactivo al proceso en ejecución
- El proceso debe reiniciarse automáticamente en caso de fallo
Lista de verificación técnica de puntos clave
Antes de confiar en Screen en un entorno de producción, verifica lo siguiente:
- `autodetach on` está presente en `~/.screenrc` — sin él, las caídas de SSH pueden matar las sesiones
- `defscrollback` está configurado en al menos 5000 líneas para cargas de trabajo con muchos registros
- `defflow off` está configurado para prevenir congelaciones accidentales de `Ctrl+S`
- Todas las sesiones de larga duración tienen nombre (`-S flag`) — nunca dependas solo de la identificación por PID
- Conoces el comando de recuperación `screen -d -r` para sesiones conectadas obsoletas
- Los sockets de sesiones muertas se limpian periódicamente con `screen -wipe`
- Si ejecutas como múltiples usuarios, entiendes el límite de propiedad de sesión root/usuario
- La variable `TERM` se verifica si las aplicaciones TUI se renderizan incorrectamente dentro de Screen
- Para trabajos en segundo plano totalmente automatizados, se usa `screen -dmS` en lugar de `nohup` o `&` simple, proporcionándote una sesión recuperable e inspeccionable
Preguntas frecuentes
¿GNU Screen sobrevive a un reinicio del servidor?
No. Las sesiones de Screen se mantienen en memoria como procesos. Un reinicio completo del servidor termina todas las sesiones de Screen y sus procesos hijos. Para procesos que deben sobrevivir a reinicios, usa unidades de systemd o un supervisor de procesos como Supervisor. Screen es la herramienta correcta para la persistencia interactiva a través de desconexiones, no a través de reinicios.
¿Cuál es la diferencia entre `screen -r` y `screen -x`?
`screen -r` se reconecta a una sesión desconectada — falla si la sesión ya está conectada en otro lugar. `screen -x` se conecta a una sesión independientemente de su estado de conexión actual, permitiendo que dos terminales compartan la misma sesión simultáneamente. Usa `-x` para depuración colaborativa; usa `-r` para reconexión estándar.
¿Cómo desplazo hacia arriba dentro de una ventana de Screen?
Entra en modo de copia con `Ctrl+A, [`, luego usa las teclas de flecha, `Page Up`/`Page Down`, o navegación de estilo vi (`Ctrl+F`, `Ctrl+B`). Presiona `Escape` o `q` para salir del modo de copia. Asegúrate de que `defscrollback` en `.screenrc` esté configurado lo suficientemente alto para retener el historial que necesitas.
¿Se puede usar Screen sin privilegios de root?
Sí. Screen se ejecuta completamente como el usuario que lo invoca. No se requieren privilegios de root para crear, conectar o gestionar sesiones. Los archivos de socket se almacenan en un directorio por usuario (típicamente `/var/run/screen/S-username/`). La única excepción es si Screen en sí no está instalado — la instalación requiere acceso al gestor de paquetes, que típicamente requiere root o sudo.
¿Por qué mi sesión de Screen muestra “Attached” cuando nadie está conectado?
Esto ocurre típicamente cuando una conexión SSH cayó sin enviar un SIGHUP limpio — por ejemplo, debido a un tiempo de espera de red en lugar de un cierre de sesión explícito. La sesión retiene su estado `Attached` porque Screen nunca recibió la señal de desconexión. Usa `screen -d -r session_name` para desconectar forzosamente la conexión fantasma y reconectarte limpiamente.
