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
Yo usaba screen hasta que encontré tmux y no pude dejar de usarlo.
Muchas gracias Rodolfo, adapté ese último escript para solucionar un problema que tenía a la hora de ejcutar varios programas servidores en conjunto.