15%

Ahorra 15%<\/span> en todos los servicios de hosting

Pon a prueba tus habilidades y obtén Descuento<\/span> en cualquier plan de hosting

Usa el código:

Skills
Comenzar
09.10.2024

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ísticaGNU Screentmux
Disponibilidad predeterminadaPreinstalado en la mayoría de las distribucionesRequiere instalación explícita
Archivo de configuración`.screenrc``.tmux.conf`
División de panelesVertical y horizontal (limitado)División completa de paneles con diseños
Scripting / automatizaciónInyección de comandos `screen -X``tmux send-keys`, API enriquecida
Personalización de la barra de estadoBásicaAltamente personalizable
Modo de copiaSimilar a Vi, menos intuitivoModos Vi y Emacs, integración con portapapeles
Compartir sesiónCompatible mediante el indicador `-x`Compatible de forma nativa
Curva de aprendizajeBajaModerada
Caso de uso idealSesiones persistentes rápidas, sistemas heredadosFlujos 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

“`

AcciónAtajo
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 / AtajoFunció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ónCaso de uso principal
Comando SSH puntual y rápidoNoLa sobrecarga no está justificada
Flujo de trabajo de terminal con múltiples panelesQuizásConsidera tmux para diseños complejos
Sesión de depuración compartidaUsa `-x` para vista compartida
Script automatizado sin interacciónNoUsa `nohup` o servicio `systemd`
Proceso interactivo que no puede ejecutarse como demonioScreen es ideal
Panel de monitorización persistenteCombina 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.

15%

Ahorra 15%<\/span> en todos los servicios de hosting

Pon a prueba tus habilidades y obtén Descuento<\/span> en cualquier plan de hosting

Usa el código:

Skills
Comenzar