2013-01-19 01:42:50 +01:00
|
|
|
# Por qué mola GNU Screen
|
2012-12-06 14:47:51 +01:00
|
|
|
|
2013-01-19 01:42:50 +01:00
|
|
|
## Introducción
|
2012-12-06 14:47:51 +01:00
|
|
|
|
|
|
|
Este pequeño tutorial es para explicaros lo (poco) que sé sobre GNU Screen
|
|
|
|
y cómo sacarle provecho a esas largas sesiones de SSH en la consola de
|
|
|
|
vuestros servidores, y es que, cuando trabajas en remoto tanto, a veces
|
2013-01-19 01:42:50 +01:00
|
|
|
necesitas más de una pantalla. Y es por eso que seguramente algún *BOFHER*
|
2012-12-06 14:47:51 +01:00
|
|
|
escribió este programa.
|
|
|
|
|
|
|
|
Y a petición de @ElAutoestopista os escribo este pequeño documento para que
|
|
|
|
los que no lo conozcan, metan esta útil herramienta en ese arsenal que todo
|
2013-01-19 01:42:50 +01:00
|
|
|
buen *sysadmin* va construyendo y siempre tiene a mano para salvar el día y
|
|
|
|
el culo de los *lusers*.
|
2012-12-06 14:47:51 +01:00
|
|
|
|
2013-01-19 01:42:50 +01:00
|
|
|
## ¿Cómo usar este documento?
|
2012-12-06 14:47:51 +01:00
|
|
|
|
|
|
|
Puedes leerlo, probar las cosas que cuento aquí, puedes coger el código
|
|
|
|
fuente y alterarlo a placer, ya que este texto esta licenciado bajo una
|
2012-12-06 15:05:24 +01:00
|
|
|
**Creative Commons 3.0 BY-SA**
|
|
|
|
[![Creative Commons License](http://i.creativecommons.org/l/by-sa/3.0/80x15.png)](http://creativecommons.org/licenses/by-sa/3.0/deed.es_ES)
|
|
|
|
y podéis conseguir el fichero Markdown de este documento (su código fuente)
|
|
|
|
en <https:////github.com/resetreboot/mola_screen>.
|
2012-12-06 14:47:51 +01:00
|
|
|
|
2013-01-19 01:42:50 +01:00
|
|
|
## GNU Screen: ¿Para qué sirve?
|
2012-12-06 14:47:51 +01:00
|
|
|
|
2013-01-19 01:42:50 +01:00
|
|
|
*GNU Screen* es una herramienta para héroes de la consola, de esos que te
|
|
|
|
hacen *BASH one-liners*, que saben cientos de *comandos rúnicos* que
|
2012-12-06 14:47:51 +01:00
|
|
|
desatan la magia del sistema. Y es que en más de una ocasión nos hemos
|
|
|
|
encontrado con que necesitamos **más de una consola** con la que trabajar.
|
|
|
|
Alguno dirá que para eso su terminal tiene pestañas, o usan el genial
|
2013-01-19 01:42:50 +01:00
|
|
|
*terminator* para dividir su pantalla en varias consolas a la vez, pero o
|
2012-12-06 14:47:51 +01:00
|
|
|
bien te obligan a usar el ratón o necesitamos **un extra** para lo que
|
|
|
|
pretendemos hacer.
|
|
|
|
|
|
|
|
¿Nunca os ha pasado que se necesita lanzar un proceso, vigilando la salida
|
2013-01-19 01:42:50 +01:00
|
|
|
del mismo por *stdout*, en un servidor remoto pero va a tardar horas y
|
|
|
|
es hora de irse a casa? *Screen* tiene la solución para ese tipo de problemas.
|
2012-12-06 14:47:51 +01:00
|
|
|
|
2013-01-19 01:42:50 +01:00
|
|
|
Y es que *Screen* permite tener varias pantallas virtuales a la vez, cambiar
|
|
|
|
entre ellas a golpe de teclado e incluso hacer un *detach* de la pantalla y
|
2012-12-06 14:47:51 +01:00
|
|
|
salir del sistema sabiendo con seguridad que el proceso no se ha cerrado y
|
|
|
|
que su verborrea se quedará almacenada en algún lugar, esperando a que
|
|
|
|
volvamos y la enganchemos de nuevo, como si no hubiera pasado nada.
|
|
|
|
|
2013-01-19 01:42:50 +01:00
|
|
|
## Primeros pasos
|
2012-12-06 14:47:51 +01:00
|
|
|
|
2013-01-19 01:42:50 +01:00
|
|
|
Lanzar *Screen* es tan sencillo como teclear en nuestra línea de comandos
|
2012-12-06 14:47:51 +01:00
|
|
|
favorita `$ screen` y nos saludará con una pantalla con la versión, la
|
|
|
|
licencia y nos invita a pulsar la barra espaciadora para que nos cuente más
|
2013-01-19 01:42:50 +01:00
|
|
|
o bien presionar *Enter* para comenzar a usarlo.
|
2012-12-06 14:47:51 +01:00
|
|
|
|
2013-01-19 01:42:50 +01:00
|
|
|
Lo siguiente que veréis es el *prompt* de vuestro intérprete de comandos
|
2012-12-06 14:47:51 +01:00
|
|
|
y parecerá que nada ha cambiado. Pero probad a entrar en algún directorio y
|
2012-12-06 18:56:27 +01:00
|
|
|
luego un `ls` para obtener el listado de ficheros. Después, pulsad `Ctrl-a`
|
2012-12-06 14:47:51 +01:00
|
|
|
y justo después la tecla `c`. El listado de ficheros habrá desaparecido y
|
2013-01-19 01:42:50 +01:00
|
|
|
de nuevo el *prompt* os saludará. Hemos abierto una nueva ventana, para hacer
|
2012-12-06 14:47:51 +01:00
|
|
|
otra cosa sin mayor problema. ¿Cómo recuperamos ese listado que estábamos
|
2013-01-19 01:42:50 +01:00
|
|
|
mirando? Pulsamos `Ctrl-a` y luego la tecla `0`. En *Screen* las ventanas que
|
2012-12-06 14:47:51 +01:00
|
|
|
vamos creando se numeran del 0 al número de ventanas que necesitamos. La
|
2012-12-06 18:56:27 +01:00
|
|
|
primera es el 0, la nueva es el 1. Así, que pulsando `Ctrl-a` y luego la tecla
|
2013-01-19 01:42:50 +01:00
|
|
|
`1` recuperaremos el *prompt* nuevo que hemos creado.
|
2012-12-06 14:47:51 +01:00
|
|
|
|
2013-01-19 01:42:50 +01:00
|
|
|
Como se puede ver, *Screen* procura no molestarte poniendo más cosas en la
|
2012-12-06 14:47:51 +01:00
|
|
|
pantalla, pero cuando tengas un buen puñado de ventanas abiertas, a veces te
|
2012-12-06 18:56:27 +01:00
|
|
|
preguntarás en cual de ellas estas. `Ctrl-a` y luego `w` te mostrará un
|
2012-12-06 14:47:51 +01:00
|
|
|
listado de ventanas, con el número o **el nombre** de las ventanas abiertas,
|
|
|
|
con el nombre del proceso que funciona dentro de esa ventana y un `*` que te
|
|
|
|
indica en qué ventana estas.
|
2012-12-06 18:56:27 +01:00
|
|
|
|
|
|
|
Puede suceder que tener un `(1)\*bash $` como nombre de una ventana no
|
2013-01-19 01:42:50 +01:00
|
|
|
resulte muy descriptivo, pero *Screen* nos permite darles nombres a las
|
2012-12-06 18:56:27 +01:00
|
|
|
ventanas, con `Ctrl-a` y luego `A` (ojo, mayúscula) podremos bautizar a la
|
|
|
|
ventana actual con el nombre que deseemos. Así, al pedir el listado de
|
|
|
|
ventanas, veremos sus nombres y podremos identificarlas rápidamente.
|
|
|
|
|
2013-01-19 01:42:50 +01:00
|
|
|
## Pantalla partida
|
2012-12-06 18:56:27 +01:00
|
|
|
|
2013-01-19 01:42:50 +01:00
|
|
|
*Screen* permite tener más de una ventana en nuestra pantalla, de forma que
|
2012-12-06 18:56:27 +01:00
|
|
|
puedas tener más de una consola o programa a la vez, y así controlar diversos
|
|
|
|
procesos sin mayor problema. Un gran ejemplo de este funcionamiento es el
|
2013-01-19 01:42:50 +01:00
|
|
|
plugin de *user list* para `irssi`, que requiere de *Screen* para funcionar,
|
2012-12-06 18:56:27 +01:00
|
|
|
partiendo la pantalla en dos partes; `irssi` y la salida del plugin, en
|
|
|
|
vertical.
|
|
|
|
|
|
|
|
La forma básica de gestionar ventanas es la siguiente.
|
|
|
|
|
|
|
|
* `Ctrl-a` + `S`: Divide la pantalla en dos, horizontalmente.
|
|
|
|
* `Ctrl-a` + `<Tab>`: Pasa de una ventana a la siguiente.
|
2013-01-19 01:42:50 +01:00
|
|
|
* `Ctrl-a` + `Q`: Elimina todas las ventanas y te deja con una sola.
|
|
|
|
* `Ctrl-a` + `X`: Elimina la ventana actual.
|
2012-12-06 18:56:27 +01:00
|
|
|
|
2013-01-19 01:42:50 +01:00
|
|
|
## Sesiones
|
2012-12-06 18:56:27 +01:00
|
|
|
|
2013-01-19 01:42:50 +01:00
|
|
|
Ya he comentado las funciones de *detach*, como la que uso en un servidor de
|
2012-12-06 18:56:27 +01:00
|
|
|
Minecraft que llevo. Esta hecho en Java y Notch (el creador) no le ha puesto
|
2013-01-19 01:42:50 +01:00
|
|
|
un modo *daemon* que permita lanzarlo sin tener una salida por consola. Pues
|
|
|
|
bien, gracias a *Screen* lanzo el servidor, tengo la consola de control y con
|
2012-12-06 18:56:27 +01:00
|
|
|
`Ctrl-a` y luego la tecla `d` la sesión se desacopla de la consola y puedo
|
|
|
|
cerrar mi sesión de SSH con el servidor, sabiendo que el programa continúa
|
|
|
|
funcionando. Cuando deseo reiniciar el servidor, o bien lanzar algún comando,
|
2013-01-19 01:42:50 +01:00
|
|
|
sólo tengo que invocar a *Screen* tal que así:
|
2012-12-06 18:56:27 +01:00
|
|
|
|
2013-01-19 01:42:50 +01:00
|
|
|
$ screen -r
|
2012-12-06 18:56:27 +01:00
|
|
|
|
|
|
|
Que le indica que deseo reconectar con la sesión que tengo iniciada en alguna
|
2013-01-19 01:42:50 +01:00
|
|
|
parte. El problema viene cuando tienes más de una sesión de *Screen* iniciada
|
2012-12-06 18:56:27 +01:00
|
|
|
e intentas recuperar alguna. El programa te avisará de que tienes más de una
|
|
|
|
sesión y que debes de indicarle el nombre de la sesión que deseas recuperar
|
|
|
|
justo después del parámetro `-r`.
|
|
|
|
|
2013-01-19 01:42:50 +01:00
|
|
|
Además, si sueles tener varias sesiones de *Screen* en tu servidor, y las
|
2012-12-06 18:56:27 +01:00
|
|
|
abres y cierras constantemente `screen -ls` te listará las sesiones abiertas
|
|
|
|
actualmente, y asi escoger la que realmente quieres recuperar.
|
2013-01-19 01:42:50 +01:00
|
|
|
|
|
|
|
Otra utilidad muy chula, especialmente si llevas un *padawan*, es compartir
|
|
|
|
una sesión de *Screen* ya abierta, pudiendo más de una persona ver lo mismo
|
|
|
|
como una sesión colaborativa. Por cierto, por razones de seguridad, sólo un
|
|
|
|
usuario puede conectarse a una sesión abierta por ese mismo usuario. Así que
|
|
|
|
ya sabéis.
|
|
|
|
|
|
|
|
Para conectar a una sesión que ya esta abierta:
|
|
|
|
|
|
|
|
$ screen -x
|
|
|
|
|
|
|
|
Y ya está, consola multiplayer al canto para todos. Para salir de la sesión,
|
|
|
|
usando el comando de *detach* abandonaréis la sesión sin cerrarla y sin
|
|
|
|
fastidiar a los otros que estén conectados en ese momento.
|
|
|
|
|
|
|
|
## Movimientos y gestión del *buffer*
|
|
|
|
|
|
|
|
Al usar *Screen* la gestión del *buffer* ya no corre a cargo de nuestra
|
|
|
|
terminal, si no del propio *Screen*, con lo que si desplazais el mismo en
|
|
|
|
vuestra terminal, os llevaréis una pequeña decepción.
|
|
|
|
|
|
|
|
Por supuesto, existen comandos que nos permitirán gestionar el *buffer* y
|
|
|
|
copiar los contenidos del mismo e incluso realizar una especie de captura de
|
|
|
|
pantalla. Para empezar, `Ctrl-a` + `ESC` activará el llamado *copy mode* y
|
|
|
|
podréis desplazaros por el *buffer* usando las teclas de cursor, además, con
|
|
|
|
la barra espaciadora podremos marcar un inicio y un fin de aquello que
|
|
|
|
deseamos copiar. Tras pulsar *Enter* lo seleccionado se almacenará y *Screen*
|
|
|
|
saldrá del *copy mode*. Si deseáis salir del modo sin copiar nada,
|
|
|
|
pulsad `ESC` de nuevo.
|
|
|
|
|
|
|
|
Si te has decidido a copiar algo, para poder pegarlo hay que pulsar
|
|
|
|
`Ctrl-a` + `] ` y aparecerá a partir de la posición actual del cursor.
|