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.
Últimos comentarios