Ejecutar un script en segundo plano con GNU Screen

Veamos cómo lanzar la ejecución de un script en segundo plano en una sesión de GNU Screen

En un artículo anterior pudiste leer en el blog unas primeras nociones de uso del multiplexador de la terminal GNU Screen:

En ese artículo el usuario Nideapum, planteaba una duda interesante:

Podrías poner también como lanzar una aplicación en segundo plano directamente en una sola línea de comandos.

Después de estar leyendo la documentación y alguna web, ví cómo podría hacerse. Vamos al lío.

Vamos a plantear la cuestión. Lo que queremos es ejecutar una tarea en una sesión de de GNU Screen, pero sin solamente ejecutando un comando en el que invoquemos a GNU Screen con los parámetros correspondientes y la tarea a ejecutar.

En este caso de ejemplo quiero ejecutar en segundo plano la ejecución de un script que simplemente va contando segundos y los muestra por pantalla.

De este modo, podremos ordenar la ejecución del script en segundo plano en una sesión de GNU Screen y entrar después de un tiempo y ver que efectivamente se está ejecutando.

El script, al que he llamado cuenta.sh (y al que he dado derechos de ejecución con chmod +x es algo tan sencillo como esto:

#! /bin/sh

while :
    do
        clear
        ((a++))
        echo "Contando... " $a
        sleep 1
    done

Ahora vamos a crear la sesión, que llamaremos ejemplo:

screen -AmdS ejemplo

Y después desde la terminal ejecutaremos lo siguiente:

screen -S ejemplo -p 0 -X stuff $'./cuenta.sh\r'   

  • screen → es el comando para ejecutar screen
  • -S ejemplo → es el comando para llamar a una sesión con el nombre ejemplo. Puedes ponerle el nombre que quieras, o como le hayas llamado en el comando anterior.
  • -p 0 → le dice a screen que ejecute lo que queremos en la pantalla 0
  • X stuff $'{tu_tarea}\r’ → Con esto le decimos a screen que escriba lo siguiente, en este caso queremos que ejecute {tu_tarea}. Pero puede ser lo que quieras…

En vez de ese comando, simplemente podemos ejecutar:

screen -S ejemplo -X screen ./cuenta.sh  

Para que ejecute el comando dentro de la sesión creada y que hemos llamado ejemplo.

Con esto, el script se pone a contar en una sesión en segundo plano de GNU Screen. Podemos realizar otras tareas y retomar cómo está la ejecución del script en cualquier momento mediante:

screen -r ejemplo

Si solo tenemos una sesión de GNU Screen no hace falta especificar el nombre, y si tenemos varias y no nos acordamos del nombre de la sesión a la que queremos conectarnos, GNU Screen nos mostrará las sesiones abiertas y podremos escoger la que queramos.

Podremos ver que el script está corriendo. Si queremos volver a desconectarnos de la sesión de GNU Screen, ejecutaremos:

Ctrl-a d

Podremos volver a conectarnos las veces que queramos. Y desconectarnos otras tantas…

Si queremos finalizar la ejecución del scritp, en este caso es con Ctrl-c. Y también con un comando podremos mandarle esa finalización, mediante:

screen -S ejemplo -p 0 -X stuff $'^c\r'

Le mandamos a la sesión y pantalla que queremos el comando Ctrl-c mediante ^c

Si volvemos a conectarnos a nuestra sesión ejemplo, veremos que el script se ha detenido.

También podremos desde un comando y sin necesidad de estar en GNU Screen decir que cierre la sesión que deseamos, mediante este comando:

screen -S ejemplo -X stuff $'exit\r'

Y eso es todo. Con esto podremos registrarnos en una equipo mediante ssh y abrir una sesión en segundo plano para realizar unas tareas y dejarlas funcionando.

Después desde otro equipo distinto también con GNU Screen, podremos conectarnos a ese equipo en remoto con ssh y conectarnos a la sesión que hemos dejado funcionando

¿No es genial la cantidad de funcionalidades que ofrece GNU Screen? Gracias a Nideapum, por esa pregunta que ha despertado este artículo y espero que sea útil.

2 comentarios sobre “Ejecutar un script en segundo plano con GNU Screen

  1. Está genial la herramienta screen y las posibilidades que ofrece. Yo hace tiempo la descubrí y ahora no puedo trabajar sin ella.

    También puedes lanzar el comando así:
    screen -d -m -S nombreSesion comando

    Gracias por la respuesta y por la mención
    Un saludo

Me gustaría saber tu opinión. Deja un comentario (Puedes usar MarkDown)

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Google photo

Estás comentando usando tu cuenta de Google. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios .