Los scripts son algo indispensable en Linux y en algunas ocasiones puede ser necesario ejecutarlo en segundo plano, ya sea porque tarde mucho en finalizar o porque el programa tiene que ejecutarse de forma indefinida y al mismo tiempo se quieren analizar sus entradas/salidas en tiempo real, o cuando, en el caso de conexiones remotas, por el motivo que sea, se pueda producir una desconexión.

& y bg

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

./script.sh &

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 presioando «CTRL+Z» para suspender la ejecución del comando actual, y después invocando el comando bg:

./script.sh

pulsamos «CTRL+Z» y se mostrará que el comando ha sido pasado a segundo plano:

bg

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.

fg 2

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.

nohup ./script.sh &

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.

nohup ./script.sh > foo.out 2> foo.err < /dev/null &

Esta opción es muy útil cuando necesitamos ejecutar un proceso largo y no nos interesa saber nada de él hasta que finalice. Podemos desconectarnos irnos, regresar al día siguiente y analizar el resultado del proceso.

screen

Si invocamos un comando en segundo plano (usando nohup y &), éste se ejecutará incluso después de que cerremos nuestra sesión. Pero, en ninguno de los casos anteriores, podemos conectarnos a la misma sesión otra vez y ver exactamente qué es lo que está pasando en la pantalla, como si no nos hubiéramos desconectado. Para lograr esto, usaremos el comando screen.

Lo instalamos:

sudo apt-get install screen

El primer paso es ejecutar el script que necesitamos como parámetro del comando screen:

screen ./script.sh

Si después de ejecutar la linea anterior tecleamos “CTRL+A” y después “CTRL+D”, el sistema nos separará de la sesión actual (en la que estamos ejecutando script.sh) y nos retornará a la terminal a la espera de teclear un nuevo comando.

Llegados a este punto, podemos cerrar la sesión, irnos, regresar, iniciar una nueva sesión y recuperar la pantalla que esta corriendo nuestro. Para ello, invocaremos el comando screen con el parámetro -ls para obtener un listado de las sesiones actuales:

screen -ls
[detached from 1788.ttys000.maquina]

A continuación, mediante el parámetro -r y el identificador de la sesión recuperamos la pantalla que necesitemos:

$ screen -r 1788.ttys000.maquina

Fuente: barralog.