5.10.- Gestión de un proceso en segundo plano

El comando wait permite esperar la finalización de un proceso ejecutado en segundo plano.

Sintaxis

Esperar la finalización del proceso cuyo PID se pasa como argumento:

Esperar la finalización de todos los procesos ejecutados en segundo plano desde el shell actual:

Esperar la finalización del proceso cuyo número de job se pasa como argumento:

& y bg

Si añadimos un ampersand (&) al final del comando o del script que queremos ejecutar, éste se ejecutará en segundo plano.

Si ejecutamos un comando de la forma habitual (en primer plano o foreground) y, después de pasado un cierto tiempo, nos damos cuenta que hubiera sido mejor ejecutarlo en segundo plano o background, lo podemos hacer sin necesidad de tener que matar el proceso y volver a ejecutarlo de nuevo con el ampersand. Esto se hace pulsando “CTRL+Z” para suspender la ejecución del comando actual, y después invocando el comando bg:

Pulsamos “CTRL+Z” y se mostrará que el comando ha sido pasado a segundo plano:

Este proceso que se acaba de pasar al segundo plano, también se puede volver al primer plano con el comando fg y si hubiese varios procesos, añadiremos el numero de proceso.

nohup y &

Al finalizar una sesión en un terminal se envía un señal (SIGHUP) a todos los procesos que esté ejecutando nuestro usuario. Como resultado, dichos procesos se mueren (aunque les hayamos puesto & al final)

Para evitar esto utilizamos el comando nohup. Este comando hace que un proceso ignore la señal SIGHUP, y redirige la salida de nuestro script a un archivo nohup.out que es creado en el directorio actual.

Una buena practica sería redireccionar stdin, stdout y stderr. Básicamente, por dos razones: rastrear la salida de nuestro script en caso de producirse algún error, y evitar problemas al terminar nuestra sesión ssh, si es que la ejecutamos en un servidor remoto.

Ejemplos

Copia este script que llamaremos primos…

… que ejecutaremos en segundo plano. Observamos que tiene el PID 1603:

El shell se duerme esperando la finalización del proceso 1603 y despierta cuando el script a terminado.


  • Practica con lo aprendido en esta sección.
  • Observa el script primos donde encontramos los comandos que hemos ido aprendiendo hasta ahora.