TIP Usando screen

De Gentoo Linux Wiki

Este artículo es parte de las series Consejos y Trucos.
Terminales / Shells X Windows Portage Sistema Sistema de Archivos Kernel Otros

Tabla de contenidos

[editar] Introducción

Si deniegas de innecesarias ventanas abiertas, o quieres conseguir lo máximo con tu terminal, pronto screen aparecerá numerosas veces en tu

.bash_history. Encuentro que la valla para empezar a usar screen es un poco alta, y quiero bajarla para mis lectores.

Lo que hace screen es permitirte correr varios procesos de shell en una única terminal. Entonces en una xterm por ejemplo, puedes tener tantas instancias de bash como capas en GIMP o photoshop. Aún mejor, puedes partir tu xterm en diferentes regiones. Only ratpoison gives you more bang for your bash!

[editar] Simbología

Este documento usa la siguiente terminología para describir atajos de teclado:

  • C representa la tecla Ctrl, la cual es Strg en teclados alemanes
  • - el guión combina dos teclas que son presionadas simultáneamente
  • C-a es por lo tanto la secuencia de escape (estándar) para pasar la siguiente tecla como una orden a screen.
  • <foo> significa presionando la tecla foo

[editar] Primeros pasos

Para empezar a usar screen abre una terminal y escribe

screen (o screen -U si quieres soporte de UTF-8).

Dependiendo de la configuración de screen un mensaje te recibirá al comienzo, pero Gentoo usualmente tiene esto deshabilitado en

/etc/screenrc con la línea startup_message off . Posteriormente hablaremos más de esto.

Si presionas espacio o enter desciendes a una login shell.

La primera señal de que screen está corriendo bien la podemos descubrir tipeando C-a lo cual muestra la lista de terminales. En este momento sólo hay una. La tecla Esc cierra esa ventana.

Una nueva terminal se crea tipeando C-a c y tipeando C-a " nuevamente la lista como la actual. Luego de crear una nueva terminal es útil nombrarla con C-a A. Con C-a n para la siguiente y C-a p para la previa te cambias de ventana.

Y ahora viene la que es para mí la característica más útil de screen en absoluto: ¡Si cerramos la xterm padre screen sigue funcionando! Sencillamente "la despega" y puede ser accedida nuevamente sin ningún efecto sobre las tareas que están corriendo. Lo que lo hace ideal para estas largas compilaciones que Gentoo tiene para ofrecer a sus usuarios...

Para despegar screen uno puede usar ya sea el método de fuerza bruta, que es hacer click en la x de la esquina de la ventana, o la instancia de screen puede ser apropiadamente despegada con C-a d primero.

Ahora hemos descendido de vuelta en la shell que xterm lanzó al comienzo. De partida queremos controlar si realmente hay una sesión de screen corriendo. Estas son listadas con screen -ls.

Para acceder a esta instancia re-atachamos con screen -R. Voila, aquí estamos de nuevo!

Esto ya explica el uso básico de screen, y nos da un método para dejar las compilaciones corriendo en un (remoto?) sistema sin tener que mantener una xterm abierta todo el tiempo. Pero screen tiene más que ofrecer:

[editar] Regiones

Tal como en vim, que no es preferido por todos, podemos usar una única xterm para más de una tarea visible.

Screen se puede partir verticalmente en regiones, cada una con una terminal diferente. Para abrir una nueva región escribe C-a S (S mayúscula, por favor!). Para entrar a esa nueva región creada tabulamos a ella:

C-a <Tab> Aún no se ve nada, pero ahora podemos cambiarnos entre nuestras terminales abiertas con C-a n o

C-a p. Para cerrar una región tipea C-a X.
Una región con foco se le puede cambiar el tamaño con C-a + o C-a - Por defecto esto cambia el alto en 3 líneas. Alternativamente, puedes especificar el alto a un número absoluto yendo en el modo de comandos de screen:

[editar] Cambiando el tamaño con comandos

Tipeando C-a : pone screen en el modo de comandos y la línea de status abajo cambia. Ahora screen acepta comandos directamente y resize 24 convierte a 24 líneas de alto a la región que tiene el foco.

[editar] Problemas con screen "congelada"?

Es fácil confundirse C-a S con la minúscula C-a s la cual realmente manda un comando de congelar la xterm padre. Para revertir este efecto uno no tiene que ir tan lejos como cerrar la xterm y re-atachar de nuevo, simplemente escribe C-a q.

Lo que sucede es que screen envía todos los comandos al entorno en que está corriendo después de su secuencia de escape C-a --si es que no tienen sentido para screen en sí misma. La s realmente significa xoff y consigues el mismo efecto tipeando C-s en una xterm corriente corriendo bash.

Tal véz ya te has dado cuenta de que aún puedes navegar y usar las otras ventanas, y más aún crear otras nuevas después de un accidental

C-a s. Esto lo vuelve inútil para una función de salvapantallas. Para un apropiado bloqueo de sesión sencillamente tipea C-a x y sólo tu contraseña te da acceso otra vez.

[editar] copy-paste con screen!

En una xterm— (aterm|xterm|eterm|konsole|loquesea)?— podemos copiar y pegar texto entre ventanas en screen, como un link en irssi a una bash $ opera -newpage http://gentoo.org (el cual uso para mantener el historial de la barra de direcciones limpio). Si trabajamos fuera del X, en una tty, no hay mouse disponible pero afortunadamente screen es útil aún en esta situación:

[editar] desplazándonos hacia atrás en screen

Para entrar al modo scrollback presiona C-a <Esc>, una nota en la barra de estado nos dice "Modo copiar columna...". Ahora las teclas <PageUp> y <PageDown> o las secuencias de comando C-u y C-d funcionan como mecanismo de desplazamiento. Bastante útil por si mismo, pero sólo el comienzo del copy-paste:

[editar] Seleccionando texto, copiando, pegando

Copiar funciona seleccionando una posición de inicio y una de fin para el texto a ser copiado. Marca con la tecla <Space> . Puedes navegar por el búffer con las teclas <h>, <j>, <k>, <l>, funcionan tal como en el editor vim. En la mayoría de las máquinas puedes usar las flechas también, si no estás familiarizado con los movimientos de vim. Y para los fans de emacs este comportamiento se puede cambiar en el archivo

.screenrc. Sugiero consultar la página del manual para enriquecer el conjunto de movimientos.

El contenido del búffer puede ser pegado en cualquier otra ventana de screen de la sesión actual tipeando C-a].

Entonces imagina que quieres abrir un link pegado en un canal de IRC, presiona C-a <Esc>, muévete al comienzo del link, presiona <Space> y avanza hasta el final por un segundo <Space>. Ahora abre una nueva ventana con

C-a c, escribe w3m C-a ] y a navegar!

[editar] Copiado avanzado

Uno puede acceder hasta al sistema de archivos para copiar archivos en screen, o concatenar selecciones en una ventana de screen a un archivo en la máquina donde screen está corriendo. Para copiar una firma divertida desde un posteo en Usenet pon screen en modo de copia con C-a <Esc>, marca el texto deseado con <Space> y luego define un búffer de archivo en el directorio actual con C-a :bufferfile notes.txt. Este archivo es escrito (y sobreescrito si existe!) con C-a >.

Nota que C-a : pone screen en modo de comandos y en realidad escribes en la barra de estado. Si no se da el búffer de archivo, screen usa /tmp/screen-exchange por defecto, porque esta característica está pensada ante todo para intercambiar datos entre los usuarios de screen en el mismo sistema.


[editar] Acceso directo a terminales abiertas

Además de el, algo tedioso, ciclo por las terminales que C-a " nos muestra ellas también están accesibles directamente con su identificador numérico: C-a 1 abre la primera terminal en la región actual, y sin modificación esto funciona para todos los identificadores de un dígito.

En caso de que dirijamos nuestra vida computera completamente a la línea de comandos y necesitemos más de 9 terminales en cualquier momento, podemos instruir a screen para acceder a ids de 2 dígitos editando un archivo

~/.screenrc. Este es leído por screen en la partida después de que /etc/screenrc es ejecutado, entonces tienes que reiniciar una sesión de screen si haces cualquier modificación. Pon esto en

~/.screenrc:


Archivo: ~/.screenrc

bind -c selectHighs 0 select 10
bind -c selectHighs 1 select 11
bind -c selectHighs 2 select 12
bind - command -c selectHighs

Ahora C-a - 0 abre la 10ª terminal bajo el control de screen (si existe).


[editar] Más configuraciones útiles en .screenrc

La primera cosa que agrego es vbell on lo cual hace más llevadero los intentos fallidos de completación con tab, este y otros errores son mostrados en la barra superior de la terminal en vez de que la terminal pestañee.

A screen también se le puede indicar que abra varias terminales al partir, e inclusive asignar nombres más significativos a estas terminales en por ej. la lista de terminales mostrada con C-a " . Los siguientes ejemplos explican la sintaxis:


Archivo: ~/.screenrc

screen -t E-Mail 2 mutt -y
screen -t irssi 3 irssi
screen -t mp3blaster 4 mp3blaster
screen -t news 5 slrn -h news.individual.net -f /home/cprior/.jnewsrc
screen -t rss 6 raggle
screen -t root 1 su -

Estos comandos abren una segunda ventana con el título E-Mail y la vista de casilla de correo de Mutt. La razón por la que puse la primera ventana al final es porque me gusta abrir una shell de root por cualquier tarea administrativa y quiero que screen me transfiera a la solicitud de contraseña. De otra forma terminaría revuelto y tendría que C-a n a ella. Otras formas de preseleccionar ventanas están explicadas en la página del manual para la opción -p.

Cualquier otro archivo puede ser usado en vez de ~/.screenrc con la opción -c, por ej. screen -c /dev/null el cual uso en el infrecuente caso en que quiero usar screen como si no tuviera mi .screenrc.

[editar] Más sobre retomar sesiones de screen

Una sesión remota de screen a veces no es despachada apropiadamente cuando por ej. la xterm local fue cerrada o la conección a la red cayó. Sin embargo aún vemos la sesión con screen -ls.

Para retomar esta sesión podemos ya sea usar el nombre de la sesión o decirle a screen que la despache antes; dicha forma es la más sencilla si sólo hay una sesión corriendo: screen -DR. Para retomar una sesión específica mostrada por screen -ls, como -r [pid.tty.host] , donde [pid.tty.host] es por ej. 13539.pts-0.hostname, usa

screen -r 13539.pts-0.hostname.

[editar] Nombrando Sesiones

Nombrar sesiones de screen puede ayudarte a recordarlas sin tener que usar ls y tipear el pid. screen -S foo crea la sesión de nombre foo y entra en ella. Si sales de la sesión con C-a d puedes volver a ella tipeando screen -x foo que reconecta a la sesión de nombre foo.

Puedes nombrar e iniciar una sesión sin entrar en ella con screen -dmS foo

[editar] Modo multi-usuario

Útil para sesiones de instalación colaborativa es el modo multiusuario de screen. En gentoo esto está deshabilitado por defecto porque requiere de setuid root. Si sabes de las potenciales implicancias de seguridad puedes habilitarla:

chmod u+s /usr/bin/screen chmod go-w /var/run/screen

y editando /etc/screenrc, cambiando la opción multiuser off a on.

Un segundo usuario en un sistema luego puede incorporarse a la sesión tipeando

screen -r propietario-de-la-sesión/[pid.tty.host]

[editar] Monitoreando actividad

Un emerge -uDv world en una ventana entre varias puede llevar a numerosos C-a n C-a p; ya terminó? Para esto screen tiene una característica que nos notifica en cualquier sesión que estemos trabajando.

El comando C-a _ cambia al modo de monitoreo por 15 segundos de silencio, el cual ubica una notificación en el área de estado de una xterm. Al repetir este comando se detiene el monitoreo. Entonces cuando termine la compilación, se nos informará sin importar en la sesión en que estemos.

En la situación opuesta, C-a M hace a screen monitorear por toda actividad que ocurra. Ocasionalmente uso el cliente de MSN de línea de comandos pebrot, y siempre seteo su ventana para notificarme por ejemplo, cuando ocurre un inicio de sesión.

Herramientas personales