¿GNU Screen?
Screen es un completo administrador de sesiones de usuario, es decir que nos permite usar multiples sesiones (shells) sobre una sola terminal como si estas fuesen independientes. El alcance de esta nota es explicarles este comando de una manera sencilla (sin profundizar) y mostrarles una implementación dentro de un script, ¿va?Si tienes una sesión establecida, por ejemplo una VPN hacia tu trabajo esta herramienta puede ser tu mejor opción para trabajar con multiples sesiones o si te encuentras ejecutando algún programa tal como un application server/container y necesitas ver la salida de esa aplicación y moverla a segundo plano sin perder tu sesión de usuario, uno de los casos donde me ha resultado muy útil es para capacitar a mis compañeros de manera remota.
Lo mas interesante es que puedes salirte de tu cuenta y dejar screen ejecutándose en segundo plano y si es necesario, ingresar nuevamente y retomar el control de la terminal al seleccionar la sesión de screen anteriormente ejecutada, interesante ¿verdad?
Es necesario para poder trabajar con Screen el conocer algunas secuencias de teclado para moverse entre las sesiones, regresar a primer plano o visualizar regiones de trabajo. Listo algunas de las más usadas, si necesitas mayor información siempre puedes consultar el manual en linea o preguntarle a google:
Secuencia | Comportamiento esperado |
---|---|
[Ctrl + a] | Indica a screen la ejecución de un nuevo comando |
[Ctrl + a] + " | Presenta una lista de todas las sesiones disponibles |
[Ctrl + a] + 0 ... 9 | Selecciona la sesión [0..9] disponible |
[Ctrl + a] + c | Crear una nueva sesión de usuario |
[Ctrl + a] + d | Enviar la terminal a segundo plano |
[Ctrl + a] + n | Cambiarse a la siguiente sesión de usuario |
[Ctrl + a] + p | Cambiarse a la anterior sesión de usuario |
Configuración
Como cualquier herramienta, screen también cuenta con un archivo de configuración. Aunque este no es necesario para su ejecución, adecuaremos uno para su comprensión. Copialo y pégalo en un archivo .screenrc dentro del home de tu usuario.# .screenrc # vim: set et ts=2 sw=2 sts=2 si ai: # .screenrc # = # # Andres Aquino# Hewlett-Packard Company # # # let's override startup_message off vbell off msgwait 1 altscreen on shell -$SHELL defutf8 on shelltitle terminal # don't screen resize termcapinfo xterm Z0=\E[?3h:Z1=\E[?3l:is=\E[r\E[m\E[2J\E[H\E[?7h\E[?1;4;6l # Log 10000 lines defscrollback 100000 # keybindings bindkey -k k3 prev # F3 | Previous Window bindkey -k k4 next # F4 | Next Window register r "^a:source ${HOME}/.screenrc" # | Goes with F5 definition bindkey -k k5 process r # F5 | Reload profile bindkey -k k6 detach # F6 | Detach from this session # Window tabs, second to last line caption always '%{= WK}%?%-Lw%?%{K}(%{k}%n*%f%t%?(%u)%?%{K})%{K}%?%+Lw%?%?%= %{k}' # Status string, last line hardstatus alwayslastline hardstatus string '%{Wk}%{B}Hewlett-Packard Company%{= Wk} %100`%120`%= %100`%120`%D|%Y.%m.%d~%0c:%s'
Casos Prácticos
# | Descripción | ||||
---|---|---|---|---|---|
1 | Crear un nuevo pool de sesiones de usuario, sin ingresar dejando en segundo plano. $> screen -d -m -S SessionName
| ||||
2 | Ejecutar un comando en una sesión determinada $> screen -r TerminalName -p IDSession -X stuff "$(printf '%b' "COMMAND\015")"
y en la sesión...
| ||||
3 | Activar un archivo de registro/log para una sesión volcando cada 5 segundos. $> screen -r TerminalName -p IDSession -X log off $> screen -r TerminalName -p IDSession -X logfile ~/mySession.log $> screen -r TerminalName -p IDSession -X logfile flush 5 $> screen -r TerminalName -p IDSession -X log on
validamos el archivo de log...
|
Ciertamente existen otras alternativas como tmux (@petrohs nos da una breve nota al respecto aquí), sin embargo GNUScreen viene de cajón en la mayoría de los UNIX, en especial para mi que trabajo con HP-UX; así que lo que aquí encontrarás funcionará en HP-UX, de paso en GNULinux (RedHat, Ubuntu) y OS-X (si, el de MacOS).
Referencias
buen camino!