223 - Trabajos en segundo plano

PodcastPodcast

223 - Trabajos en segundo plano

Diferentes opciones para dejar aplicaciones, procesos o trabajos en segundo plano, y que no se cierren con el terminal.

1:25
-3:15

Recientemente en el grupo de Telegram se planteó el tema de dejar una aplicación, un proceso, funcionando cuando cerramos el terminal. Es decir, que cerrar el terminal no signifique, terminar también con la aplicación que estamos ejecutando. Para este fin tienes diferentes herramientas, algunas de las cuales he comentado en el podcast. Y es precisamente de lo que quiero hablar en este nuevo episodio del podcast. Comentarte que opciones tienes para dejar tus aplicaciones funcionando cuando cierres el terminal, es decir, trabajos en segundo plano.

¿Para que quieres dejar trabajos en segundo plano?¿Para que quieres dejar tu aplicación funcionando en segundo plano?. Seguro que ya se te han ocurrido una decena de situaciones en las que dejar tu aplicación corriendo en segundo plano. En mi caso, me sucede cuando quiero convertir un vídeo en audio o al revés.

Trabajos en segundo plano

Trabajos en segundo plano

Un ejemplo práctico de trabajos en segundo plano

Un ejemplo práctico que me ha sucedido recientemente con los trabajos en segundo plano, y que parcialmente, te comenté, es sobre el paquete de Telegram.

Crear el paquete de Telegram es algo que lleva un tiempo, pero no excesivo. Se trata de descargar los binarios, empaquetarlos y subirlos. Esto puede ser en total unos cinco minutos. El problema viene a continuación, crear paquetes para las distintas versiones de Ubuntu. En este caso, tienes que esperar, hasta que ha terminado el paquete de una versión, para empezar con el siguiente.

Esto depende de la carga que existe en los servidores de Launchpad. Puede ser que lleve unos pocos minutos, hasta horas o días. Para realizar esta operación, compruebo cada 10 minutos si se ha creado el paquete. Todo ello mediante un script evidentemente.

Ese script lo lanzo desde un VPS, que es donde está automatizado el proceso. Pero, ¿que sucede en el caso de que quiera cerrar el terminal? Pues lo que te imaginas… El empaquetado termina, el trabajo finaliza y todo se queda a medias.

La solución, pasa efectivamente, por enviar el proceso a segundo plano para evitar esta situación. No solo se trata de enviar a segundo plano, si no que además hay que desacoplarlo del terminal, para que cuando cierres el terminal, se cierre no termine los trabajos en segundo plano que hayas lanzado.

Soluciones para realizar trabajos en segundo plano

Como de costumbre, para realizar una misma tarea en Linux, tienes diferentes opciones y soluciones. Desde las mas sencillas a las mas complejas. En este caso, te voy a comentar algunas de ellas, y tu decides, cual utilizar para cada caso. Y es que esta es una de las grandes ventajas de tener tantas opciones. La solución que para un momento te pueda resultar fantástica, en otra situación puede ser que no lo sea tanto.

Sobre procesos en segundo plano

Lo primero, antes de adentrarte en los procesos en segundo plano, te recomiendo le des una lectura al artículo sobre procesos en segundo plano.

En este artículo encontrarás, con ejemplos, como puedes pasar una aplicación o proceso que tengas funcionando en primer plano, a segundo plano. Y no solo pasarlo a segundo plano, sino también iniciarlo.

Para trabajar con procesos en segundo plano tienes las herramientas jobs, fg, bg y kill.

  • jobs lista todos los procesos que estén corriendo acoplados a ese terminal.
  • Ctrl+z pasas un proceso en ejecución a segundo plano.
  • fg %<número> trae el proceso número a primer plano.
  • bg %<número> inicia el proceso número en segundo plano.
  • kill %<número> detiene el proceso número.

Si quieres lanzar un proceso directamente en segundo plano, por ejemplo sleep 100, lo tienes que ejecutar añadiendo & al final, como te muestro en la siguiente instrucción,

sleep 100 &

Desacoplando procesos con nohup

La primera de las soluciones, de la que quiero hablarte, para desacoplar procesos, es nohup. Su uso es muy sencillo, tan solo tienes que preceder nohup a la instrucción que quieras ejecutar. Así, para el caso anterior, solo tienes que ejecutar,

nohup sleep 100 &

De esta manera, si ahora ejecutas el comando jobs, lo verás entre el listado de procesos que se están ejecutando. Sin embargo, si cierras el terminal, y compruebas si está trabajando en segundo plano lo encontrarás ahí,

ps -ef | grep sleep

Desacoplando procesos con disown

Otra interesante opción es utilizar disown. Para mostrarte el funcionamiento, te recomiendo lo pruebes con el siguiente script en bash,

#!/bin/bash
while [ 1 -eq 1 ]
do
    date >> salida.txt 2>&1
    sleep 1
done

Ahora inicia el proceso de forma normal con bash ejemplo.sh. Si te fijas en el archivo salida.txt, verás que va creciendo. Incluso puedes hacer tail -f salida.txt, en otro terminal, para que veas los cambios que se van produciendo.

Ahora te toca mandar el proceso a segundo plano con Ctrl+z. Verás que te indica que se ha detenido. Para reanudar el proceso tienes que utilizar bg. Pero, si cierras ahora el terminal, verás que se detiene el proceso. Para evitarlo tienes que utilizar entonces disown %1.

Ahora si ejecutas jobs verás que no aparece en el listado de procesos en segundo plano. Si quisieras que siguiera apareciendo, tienes que utilizar la opción -h, de la siguiente forma,

disown -h %1

La ventaja de utilizar la opción -h es que puedes recuperar el proceso utilizando fg. Cosa que no podrás hacer en el caso de que no lo utilices.

Ahora puedes comprobar que el proceso está en funcionamiento ejecutando la siguiente instrucción, en ese mismo terminal o en otro,

ps -ef | grep ejemplo.sh

Si quisieras matar el proceso, en ese caso, tienes que utilizar kill, con el PID obtenido de la ejecución anterior.

tmux

Otra opción para realizar todo este tipo de operaciones es recurrir a la herramienta tmux, sobre la que escribí en el artículo tmux, mil terminales en uno.

tmux es relativamente mas complejo de utilizar que las dos opciones anteriores, y necesita de un mayor conocimiento de la herramienta. Sobre todo por la cantidad de atajos de teclado que existen.

Esta herramienta te permite desacoplar un proceso utilizando el atajo de teclado Ctrl+b d y en su caso volver a recuperarlo utilizando tmux a #.

Como te digo, las opciones y posibilidades que te ofrece tmux son abrumadoras, por lo que te recomiendo le des un profundo repaso antes de verte superado por tan potente herramienta.

Conclusión

Como ves, tienes diferentes opciones para llevar un proceso a segundo plano, y sobre todo para desacoplar el proceso del terminal en el que lo estás ejecutando. De esta forma, cuando cierres el terminal no matarás el proceso.


Espero que te haya gustado este nuevo episodio del podcast. Si puedes, te agradecería una valoración en iVoox y/o en Apple Podcast.

Imagen de portada de Joe Woods en Unsplash

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *