Sesión automatizada de Screen con meinscreen

En mi ordenador habitual siempre tengo abierta una sesión de Screen con unas pocas ventanas fijas, cada una con un programa de uso frecuente corriendo de forma permanente (Mutt con el correo, Gnus con los canales de noticias…). Así, cuando cambio puntualmente de equipo, puedo conectarme al primero vía SSH, adjuntar allí la anterior sesión de Screen y continuar usando los programas donde me había quedado (sin tener que recurrir a servicios web o sincronización entre equipos). Incluso he montado algún truco para poder editar ficheros y visualizar páginas web desde la sesión de Screen sobre la pantalla X o sesión de Firefox locales, pero eso es otra historia que contaré en su momento. ;)

El tema es que cada vez que iniciaba una sesión nueva en el ordenador habitual tenía que lanzar una nueva sesión de Screen, crear las ventanas, ponerles nombre (a veces tengo hasta siete ventanas abiertas) y lanzar cada programa en la ventana adecuada. No era una operación frecuente pero hacía que me diese pereza reiniciar el ordenador para probar algo, y estaba seguro de que Screen permitiría automatizar el proceso. Efectivamente podía y además era muy sencillo, aquí tenéis cómo lo hice.

En primer lugar, tenía claro que quería lanzar los programas como si los hubiera iniciado manualmente en cada intérprete de comandos porque a veces tengo que reiniciarlos (por cortes de conexión o cambios externos de configuración). Necesitaba encontrar cómo hacer automáticamente que Screen:

  1. Creara una nueva ventana.
  2. Le pusiera un nombre determinado.
  3. Ejecutara en ella un intérprete de comandos.
  4. Inyectara en el intérprete el comando correspondiente a un programa a ejecutar.

Mirando el manual encontré que todo se podía automatizar con comandos de Screen en un fichero de configuración… ¡viva! Los tres primeros puntos con el comando screen, que crea una nueva ventana con un título y el programa dado (o un intérprete si no se le indica ninguno). El cuarto con el comando stuff, que inyecta una cadena en la entrada del programa que corre en la ventana actual. Para ir directamente a la última ventana (un intérprete de comandos) se puede indicar con el comando at que stuff se ejecute en una ventana diferente de la actual.

Así nació meinscreen, que no es más que un guión trivial y un fichero de configuración de Screen, ~/.meinscreenrc:

# Configuración para la sesión principal de Screen.

# Se incluye la configuración de sistema o de usuario.
# source /etc/screenrc
source ~/.screenrc

# Se crean algunas ventanas por defecto.
screen -t mutt
screen -t gnus
# … más ventanas …
# Finalmente, un intérprete de comandos (ventana activa).
screen

# Se inician tareas como si se hubieran lanzado manualmente.
at mutt stuff "mutt -f imaps://ivan@servidor.de.correo/INBOX\012"
at gnus stuff "emacs -nw -f gnus\012"
# … más programas …

El guión meinscreen tan sólo contiene:

#!/bin/sh
exec screen -c ~/.meinscreenrc -S mein

Sólo es necesario lanzar meinscreen en un terminal y… ¡voilà! Una sesión de Screen con todos los programas en funcionamiento como si hubieran sido lanzados a mano, cada uno en su ventana con título, y de cabeza a un intérprete de comandos. Para adjuntar esta sesión de Screen desde una sesión de SSH tan sólo hay que ejecutar:

$ screen -dr mein

El nombre original del guión era myscreen, pero como todas las sesiones de Screen son igualmente mías y ésta es la principal, lo renombré a mainscreen. Al final se quedó en meinscreen como solución de compromiso. :D

Main screen turn on.