domingo, 5 de septiembre de 2010

Screen: múltiples consolas en sólo una ventana

Hace mucho que quería escribir sobre este comando, pero se me había quedado en el tintero así que lo hago ahora :P

El "screen" es un comando que sirve para virtualizar consolas y guardar aquellas que se encuentren abiertas. La mejor utilidad se puede encontrar cuando uno se conecta por ssh a algún computador remoto y zas! múltiples consolas en tan solo una conexión! :D Por qué tanta alegría? cuando se trabaja desde windows por lo general se utiliza algún programa como el putty, teniendo que ejecutarlo cada vez que se necesite tener una segunda ventana, sin embargo, si utilizamos el comando screen, con una ventana nos es suficiente ;)
Para hacer una idea de lo que hablo podemos imaginar al screen como el firefox y sus pestañas, se tiene la base (firefox) y por cada página una pestaña; además, también se puede "guardar la sesión" al momento de cerrar pudiendo volver a cargarla la próxima vez.
Ya dicha la introducción ahora veamos cómo usarlo :)


Iniciar sesión por primera vez

Ejecutar el comando "screen". Hay que hacer notar que la sesión se inicia en la misma carpeta desde donde se ejecutó el comando screen, por lo que todas las ventanas que se creen en la sesión actual cargarán la misma ruta inicial. Por ejemplo, si la ruta donde se ejecuta el comando es en "/var/log/" (pwd = /var/log/), todas las nuevas ventanas que se agreguen comenzarán en "/var/log/" y no en la raíz del usuario.
Ya estando dentro de la sesión de screen, se pueden ejecutar ciertos comandos para hacer varias cosas. Todos los comandos comienzan con "ctrl+a" seguido de la opción a utilizar, es decir: presionar "ctrl" junto con la "a", soltar las teclas y luego escribir la letra que corresponda al comando.
Las combinaciones que más utilizo y algunas otras útiles son las siguientes:

* Crear nueva ventana -> ctrl+a c

* Cambiar de ventana
Acá existen varias formas de hacerlo:

- ctrl+a " <-- muestra el listado de ventanas abiertas. Para seleccionar una ventana hay que moverse con las flechas y presionar enter sobre la ventana elegida
- ctrl+a n <-- cambia a la ventana siguiente
- ctrl+a p <-- cambia a la ventana anterior
- ctrl+a [nro de ventana] <-- cambiar a una ventana específica según posición. Las posiciones comienzan en 0. Por ejemplo: ir a la tercera ventana = ctrl+a 2

* Guardar la sesión actual y salir -> ctrl+a d
La utilidad de guardar una sesión viene dada por el hecho de que al guardar la sesión se guardan todas las ventanas y lo que ahí se estuviera ejecutando.
Al recargar una sesión guardada se carga todo tal cual como estaba al momento de guardar. Esto es especialmente útil cuando se están editando varios archivos, dado que nos evitamos el tener que volver a abrir todo la próxima vez que sigamos trabajando en ellos.

Iniciar una nueva sesión sin perder alguna existente
Sólo hay que iniciar sesión desde cero con el comando "screen"
$ screen

Finalizar sesión
Para finalizar la sesión, sin guardar, sólo hay que cerrar todas las ventanas abiertas. Ejecutar "exit" o "logout" en cada una.


Cargar sesión previamente guardada
Parar cargar cualquier sesión, se debe ejecutar el comando más la opción "r".
$ screen -r
En el caso de que se encuentren varias sesiones guardadas, aparecerá un listado con todas las existentes. Un ejemplo de sesiones creadas sería:

$ screen -r
There are several suitable screens on:
17818.pts-0.box220 (Detached)
19712.pts-0.box220 (Detached)
Type "screen [-d] -r [pid.]tty.host" to resume one of them.

Tal como sale ahí, para iniciar una sesión específica del listado habría que ejecutar la recuperación + el nombre de la sesión a cargar. Por ejemplo:

$ screen -r 19712.pts-0.box220

Soltar sesión que se encuentra "tomada"En el caso de que exista algún corte de conexión y se nos corte la comunicación con el servidor no perdemos lo que teníamos abierto, pero al volver a conectarse y tratar de recuperar la sesión con screen -r nos aparecerá un mensaje de error ya que la sesión "aparentemente" se encuentra en uso... es en estos casos donde aparece la opción "-d".
La opción -d nos sirve para liberar una sesión que se encuentra tomada, pero su mayor uso es en combinación con la opción -r.
Para recargar la sesión en la que nos encontrábamos antes de que se produjera el corte sólo debemos escribir:

$ screen -dr

En el caso de que exista más de una sesión abierta, se debe utilizar los mismo que detallo en la parte de "cargar una sesión guardada" (ver más arriba).

Otras cosas útiles

- ctrl+a A <-- asigna un nombre a la ventana actual
- ctrl+a [ <-- copiar texto en el bufer de screen
Con esta opción se puede copiar algún texto desde el editor que se esté utilizando y luego pegarla en otra ventana (si es que es muy práctico esto!). Para comenzar a copiar hay que moverse con los cursores por la pantalla y presionar la barra espaciadora justo en el punto desde dónde se iniciará la copia, luego para finalizar hay que presionar enter en el punto "hasta" donde se quiere copiar.
- ctrl+a ] <-- pegar el texto del bufer de screen

Configurar la carga de screen

Aparte de lo que comenté anteriormente, es posible configurar varias cosas para "screen" ingresando comandos en el archivo llamado ".screenrc" que se debe dejar en la raíz de la cuenta del usuario que ejecuta el comando.
No me acuerdo qué significa cada comando, así que copiaré como ejemplo el contenido de un archivo que utilizo algunas veces:

startup_message off
hardstatus alwayslastline '%{= wk}%?%-Lw%?%{r}(%{k}%n*%f%t%?(%u)%?%{r})%{k}%?%+Lw%?%?%= %m/%d %C%A'
activity ''

Ese código deja una línea fija en la parte de abajo, mostrando el listado de ventanas abiertas, cuál se está utilizando actualmente y la fecha y hora del servidor.


Lo que encuentro excelente de todo esto, es que es posible conectarse por ssh, iniciar una sesión screen, trabajar todo lo que se pueda, guardar la sesión, cerrar el ssh y después podemos cargar nuevamente la sesión de screen desde donde queramos: otra sesión ssh, el mismo computador, etc.
Es más, si estamos trabajando con screen y se corta internet o la luz, no importa! podemos recargar la sesión de screen cuando nos volvamos a conectar :D
También es práctico cuando se cargan las X, evitas tener muchas ventanas de consolas en la pantalla (xterm, gnome-terminal, etc), pudiendo tener sólo una cargada ocupando espacio y todas las demás de forma virtual.

No hay comentarios:

-