aviso: si no sabes lo que es gnu/screen, probablemente pierdas el tiempo leyendo esto. (aunque tambien puedes ir a google a buscarlo, y si crees que te puede ser util, seguir leyendo.)

bueno. los que me conocen saben que lo mio con la consola ya roza lo de tener que ir al siquiatra. y para manejar la consola, que mejor herramienta, que gnu/screen (al que de ahora en adelante llamare screen a secas, que lo otro es mu’ largo. :P ). pero arrancar screen cada vez que bares abres la consola, es poco practico (se olvida la mitad de las veces), y… screen no es la mitad de practico si descubres que cuando lo necesitas, (porque tienes que hacer un detach), no estaba abierto.

asi que, investigando, consegui integrarlo con el sistema, y que se me abriera cada vez que abro la consola (aka, cuando arranco el sistema :P ), PERO, solo bajo ciertas condiciones (no quiero que se me abra en una conexion ssh por ejemplo, porque empiezan a anidarse y me puedo volver loca…).

paso por paso:
a) arranque automatico de las X: en el /etc/profile, al final:
[ $UID != 0 ] && [ -z "`ps xa |grep /usr/bin/X |grep -v grep`" ] && startx
la primera comprobacion es no ser root (no quiero que me arranqeu las X si me logueo como root), la segunda que no esten ya corriendo las X, y lo ultimo es simplemente el startx.
NOTA: si no trabajas con las X, te resultara facil adaptar este paso leyendo el siguiente. la idea seria configurar el arranque de screen desde el profile

b) arranque de screen: en el .bashrc (idealmente, para que este disponible para todos los usuarios :P , en el /etc/bash.bashrc ), AL PRINCIPIO (juto despues del [ -z "$PS1" ] && return )
[ $UID != 0 ] && [ -z "$SSH_TTY" ] && [ -z "$STY" ] && screen -d -RR && return
lo msimo. no ser root (root va aparte), no estar en ssh (aunque este igual lo quito), no estar corriendo dentro de screen ($STY es una variable que indica el socket de screen. esta comprobacion evita un loop en el que, cada vez que lee el bashrc, lanza screen, y cada vez que lanza screen, crea una sesion de bash, y lee el bashrc), launch de screen (attach si es posible, parte de la utilidad radica ahi), y el return para que no siga leyendo porque para que, si va a crear una nueva sesion de bash dentro de screen.

hasta aqui todo perfecto. tenemos a screen que se lanza en cuanto abrimos la consola, y con un poco de ‘habilidad’ podemos crear alias en el bashrc para que ciertas cosas nos las abra en una nueva “ventana” de screen. yo lo tengo asi:

if [ "$STY" ];then
alias rtorrent="screen rtorrent -d /mnt/data/rar\'s"
alias nethack='screen nethack'
#alias python='screen python'
alias ipy='screen ipython'
man() { screen -t "man $1" man "$@" ; }
ssh() {
eval last_arg=\$$#
screen -t "$last_arg" ssh -X "$@";
}
fi
## cosa estupida que no me respeta los indents. :S

*los ejemplos largos los pego tambien aqui: http://pastie.org/1670989 por si alguien quiere verlos bien indentaditos y bonitos.

primero comprueba que estas dentro de screen (es desagradable que te cree una nueva sesion si estas fuera), y luego setea los alias, para que cuando lance ssh, me lo abra en una nueva “ventana”. la mar de practico (por cierto, la funcion de ssh no es mia, la encontre por ahi).

pero hay habia un problema. que pasa si yo pongo esto en mi bashrc??
if [ "$STY" ];then
alias su='screen -t root su'
alias mocp='screen 9 mocp'
alias axel='screen axel -n 5 -a'
alias lynx='screen lynx'
vim() { screen -t "vim" vim "$@" ; }
aptitude() { screen /usr/bin/aptitude $@ ; read a ;}
fi

pista. estoy trabajando, en una sesion creada por niky, pero tras hacer un su. aka, como root. pero root no es el propietario de la sesion.

lo que pasa es esto:

>>> screen aptitude
/var/run/screen/S-root/1571.pts-1.ian: No such file or directory

[17:59:52] - [root@ian:/home/niky]
>>>

he puesto la llamada explicita para que se vea bien. screen, por su variable $STY, sabe que esta en un socket. y lo busca. el problema, es que al ser root, pero el socket ser de niky, lo busca donde no esta. OOPS!!
idea 1: enlaces simbolicos. no funciona. screen se vuelve loco.
idea 2: modificar el codigo de screen. consegui DOS VECES que screen se me colgara. menos mal que sabia lo que habia hecho.
idea 3: y por que no dejo que root trabaje con su propia screen, pero.. DENTRO de screen??

la idea es, vale. niky tiene su screen (niky es el usuario de la maquina). root, mediante su, esta DENTRO de esa sesion. una llamada a screen da error porque screen busca el socket donde no esta. PERO. ayer leyendo el man vi esto:

(command line options )
-m causes screen to ignore the $STY environment variable. With "screen -m" creation of a new session is enforced, regardless whether screen is called from within another screen session or not.

ajaja!!! si, tras el su, en vez de llamar a screen sin mas, lo llamo como screen -m … ignora el $STY, crea su propia sesion, y puedo trabajar!!! los aliases ya funcionan bien para root!!

PERO. volvemos al principio. a mi, las cosas automaticas. tener que lanzar screen cada aranque, es muy pco practico. vamos a ponerlo en auto-launch, pues. vale. arriba teniamos como, no??

espera, querido lector. si escribo un post asi de largo, solo para decir que he descubierto que screen tiene una opcion -m, soy un poco idiota. no?? (si, ya te digo yo que si, o no lo diria :P ) problema: paar evitar el bucle, necesitas el [ -z $STY ]. (o cada llamada a screen llamaria al bashrc que llamaria a screen que…). pero… screen esta corriendo. [ -z STY ] = falso. por lo que se NO crea una nueva sesion. OOOPS!!! habemus un pequenio probelma!!! (si, y yo uno gordo con mi teclado. :S mi querer un corrector ortografico. :P )

caalma. si escribo esto es porque ya lo he solucionado. si no, lo preguntaria en espaciolinux a ver si algun alma caritativa sabe mas que yo de bash, o me da alguna idea de casualidad. :P

hay un pequenio truco. para empezar, screen -ls, nos lista las sesiones de screen, de las que es propietario el usuario que lo llama. entonces… la condicion para root, para saber si screen esta corriendo, es ni mas ni menos que esta:
[ $(screen -ls |grep pts -c) -lt 1 ]

lo explico: screen -ls nos da las sesiones de sceen del usuario que lo llama (root). el grep pts es para limpiar la salida, y le -c para que me de directamente el numero de lineas (mas limpio que si le meto un |wc -l ). los $() lo que hacen es, ejecutar el comando, y devolverme el valor, que lo compara (-lt) con el que yo le doy (1). asi, si hay menos de una (cero) sesion de screen del root ejecutandose, lanza screen.

la linea completa para el bashrc es esta:
[ $UID == 0 ] && [ -z "$SSH_TTY" ] && [ $(screen -ls |grep pts -c) -lt 1 ] && screen -m && return

en este caso, el [ $UID == 0 ], lo que hace es ejecutarlo solo si uno es root (no quiero que me haga cosas raras….)

todo bien, no?? casi. a ver…. en principio si. pero tenemos una screen dentro de otra. no me creeis?? bueno, aqui esta la prueba:

hay DOS statusbar. (barritas de abajo de “ventanas” de screen. ). muy bien. sabemos que con C-a (control + a), mandamos comandos a screen, pero.. esto… root ha abierto vim en otra ventana, y… si yo le doy a C-a n (siguiente ventana) , screen me lleva a… la shell (ventana 3). y como voy yo a vim??

facil. screen tiene una combinacion para mandar a la aplicacion de dentro la secuencia C-a, y es C-a a . asi, lo que recibe la aplicacion, es un C-a. y la aplicacion, en este caso es screen. basta con darle a la n, para que salte a la ventana siguiente de la sesion de dentro. es decir, la combinacion para ir en este momento a vim, seria C-a a n . bueno. no he usado emacs, pero para los que lo usen, no deberia parecerles una combinacion imposible :P

en fin. otro dia mas. espero que a alguien esto le sea tan util como a mi. :D

PD: y para los que usan tmux: adaptandolo, la idea es exactamente la misma. de hecho, para mi tmux no es mucho mas que screen pero con C-b en vez de C-a. (si… lo mire a ver si hacia exactamente esto, y per se, tampoco lo hacia. ) ahora, ya si no usas bash, la cosa se puede complicar “un pelin”.

Popularity: 19% [?]