Sessió automatitzada d’Screen amb meinscreen

Al meu ordinador habitual sempre tinc oberta una sessió d’Screen amb unes poques finestres fixes, cadascuna amb un programa d’ús freqüent corrent de forma permanent (Mutt amb el correu, Gnus amb els canals de notícies…). Així, quan canvie puntualment d’equip, puc connectar‐me al primer via SSH, adjuntar‐hi l’anterior sessió d’Screen i continuar usant els programes on m’havia quedat (sense haver de recórrer a serveis web o sincronització entre equips). Fins i tot he muntat algun truc per a poder editar fitxers i visualitzar pàgines web des de la sessió d’Screen sobre la pantalla X o sessió de Firefox locals, però això és una altra història que contaré en el seu moment. ;)

L’assumpte és que cada volta que iniciava una sessió nova a l’ordinador habitual havia de llançar una nova sessió d’Screen, crear les finestres, posar‐los nom (a voltes tinc fins a set finestres obertes) i llançar cada programa en la finestra adequada. No era una operació freqüent però feia que em donara peresa reiniciar l’ordinador per a provar alguna cosa, i estava segur de que Screen permetria automatitzar el procés. Efectivament podia i damunt era molt senzill, ací teniu com ho vaig fer.

En primer lloc, tenia clar que volia llançar els programes com si els haguera iniciat manualment a cada intèrpret d’ordres perquè a voltes he de reiniciar‐los (per talls de connexió o canvis externs de configuració). Havia de trobar com fer automàticament que Screen:

  1. Creara una nova finestra.
  2. Li posara un nom determinat.
  3. Hi executara un intèrpret d’ordres.
  4. Injectara a l’intèrpret l’ordre corresponent a un programa a executar.

Mirant el manual vaig trobar que tot es podia automatitzar amb ordres d’Screen en un fitxer de configuració… visca! Els tres primers punts amb l’ordre screen, que crea una nova finestra amb un títol i el programa donat (o un intèrpret si no se n’indica cap). El quart amb l’ordre stuff, que injecta una cadena en l’entrada del programa corrent en la finestra actual. Per a anar directament a l’última finestra (un intèrpret d’ordres) es pot indicar amb l’ordre at que stuff s’execute en una finestra diferent de l’actual.

Així va néixer meinscreen, que no és més que un script trivial i un fitxer de configuració d’Screen, ~/.meinscreenrc:

# Configuració per a la sessió principal d’Screen.

# S’inclou la configuració de sistema o d’usuari.
# source /etc/screenrc
source ~/.screenrc

# Es creen algunes finestres per defecte.
screen -t mutt screen -t gnus
# … més finestres …
# Finalment, un intèrpret d’ordres (finestra activa).
screen

# S’inicien tasques com si s’hagueren llançat manualment.
at mutt stuff "mutt -f imaps://ivan@servidor.de.correu/INBOX\012" at gnus
stuff "emacs -nw -f gnus\012"
# … més programes …

L’script meinscreen només conté:

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

Només cal llançar meinscreen en un terminal i… voilà! Una sessió d’Screen amb tots els programes en funcionament com si hagueren estat llançats a mà, cadascun en la seua finestra amb títol, i de cap a un intèrpret d’ordres. Per a adjuntar aquesta sessió d’Screen des d’una sessió d’SSH només cal executar:

$ screen -dr mein

El nom original de l’script era myscreen, però com que totes les sessions d’Screen són igualment meues i aquesta n’és la principal, el vaig reanomenar mainscreen. Al final es quedà en meinscreen com a solució de compromís. :D

Main screen turn on.