By | 24 agosto, 2013

Uno de mis programas favoritos para administrar servidores es screen pues permite multiplexar una terminal como si fuera varias terminales (ventanas de comandos); es decir que luego de establecer una conección al servidor (mediante SSH) se pueden poner a correr varios programas como si se tuviera varias conexiones establecidas a la vez.

Además se puede salir y desconectarse del servidor, dejando corriendo cada uno de esos programas.  Al volver a conectarse se pueden re-tomar esas terminales que se dejaron abiertas. Sería como poner a correr un programa en un PC y apagar el monitor que se enciende al día siguiente; esto hace screen, cuando se desconecta y se vuelve a conectar a los servidores remotos (en la nube).

Generalmente conecto por SSH e invoco screen, dentro del cual pongo a correr lo que necesito; pero me surgió la necesidad auotmatizar (sin mi intervención) todo para actuar en varios servidores y aquí describo como lo he hecho.

Se puede invocar screen con el programa a correr y quedar desvinculado (deattached) de la terminal screen, invocándolo de esta forma:

screen -dmS prueba watch ls -al
  • -d hace que screen se invoque en forma desvinculada, es como escribir «C-a d» dentro de screen
  • -m hace que screen ignore si hay otro screen corriendo
  • -S prueba es el nombre de la sesión de screen, que luego puede ser usado para gestionar la misma en forma automatizada

ahora solo hay que llamarlo en una sesión ssh:

ssh -p222 -i ~/.ssh/cert1 rodolfo@server.remoto screen -dmS prueba watch ls -al

(los parámetros de la sesión ssh son ejemplo y deben adaptarse al caso particular)

Luego de ejecutar esto se obtiene nuevamente el prompt local ($), pero ha quedado corriendo una sesión screen en el servidor remoto que está ejecutado el watch ls -al, veámoslo:

$ ssh -p222 -i ~/.ssh/cert1 rodolfo@server.remoto screen -ls
There is a screen on:
	24411.prueba	(00/22/2113 33:44:55 PM)	(Detached)
1 Socket in /var/run/screen/S-root.
$
$ ssh -p222 -i ~/.ssh/cert1 rodolfo@server.remoto ps ax | grep -i screen
24411 ?        Ss     0:00 /usr/bin/SCREEN -dmS prueba watch ls -al

para apagarlo, también remotamente, se puede enviar la señal TERM al PID remoto:

ssh -p222 -i ~/.ssh/cert1 rodolfo@server.remoto 'kill $(screen -ls | grep prueba | cut -d. -f1)'

para los screen de nuestra sesión prueba. Si se quieren apagar todos los screen, se puede invocar más fácilmente asi:

ssh -p222 -i ~/.ssh/cert1 rodolfo@server.remoto 'kill $(pidof SCREEN)'

Mi requerimiento en varios servidores, me llevó a armar un pequeño script que recibe por parámetros start/stop y devuelve la lista de screen corriendo:

#!/bin/bash
# ejecuta screen remotos en los SERVERS

SERVERS="server1 server2 server3 server4 server5"

case $1 in
start) for i in $SERVERS; do
       ssh -p222 -i ~/.ssh/cert1 rodolfo@$i screen -dmS prueba watch ls -al
       done ;;
stop)  for i in $SERVERS; do
       ssh $i 'kill $(pidof SCREEN)'
       done ;;
*)     typeset -i a=1
       for i in $SERVERS; do
          echo "$a ==== $i"
          ssh $i '/usr/bin/screen -list | grep Detached'
          a=$a+1
       done ;;
esac

exit 0

2 Replies to “Automatizar proceso en screen”

  1. Sebastián Gurin

    Muchas gracias Rodolfo, adapté ese último escript para solucionar un problema que tenía a la hora de ejcutar varios programas servidores en conjunto.

Responder a Sebastián Gurin

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *