Cómo utilizar el control de tareas de Bash para gestionar procesos en primer y segundo plano

Introducción
En un tutorial anterior , analizamos cómo se pueden usar los comandos , y para controlar procesos en su sistema. Esta guía destaca cómo ps
, kill
el sistema Linux y su terminal se unen para ofrecer control de procesos y trabajos.nice
bash
Este artículo se centrará en la gestión de procesos en primer plano y en segundo plano y demostrará cómo aprovechar las funciones de control de trabajos de su shell para obtener más flexibilidad en la forma de ejecutar comandos.
Prerrequisitos
Para seguir esta guía, necesitarás tener acceso a una computadora que ejecute la bash
interfaz de shell. bash
es el shell predeterminado en muchos sistemas operativos basados en Linux y está disponible en muchos sistemas operativos tipo Unix, incluido macOS. Ten en cuenta que este tutorial se validó utilizando un servidor privado virtual Linux que ejecuta Ubuntu 20.04.
Si planea utilizar un servidor remoto para seguir esta guía, le recomendamos que primero complete nuestra guía de configuración inicial del servidor . Al hacerlo, obtendrá un entorno de servidor seguro (que incluye un usuario no root con sudo
privilegios y un firewall configurado con UFW) que puede utilizar para desarrollar sus habilidades en Linux.
Gestión de procesos en primer plano
La mayoría de los procesos que se inician en una máquina Linux se ejecutan en primer plano. El comando comenzará a ejecutarse, bloqueando el uso del shell durante la duración del proceso. El proceso puede permitir la interacción del usuario o simplemente ejecutar un procedimiento y luego salir. Cualquier resultado se mostrará en la ventana de terminal de forma predeterminada. Analizaremos la forma básica de administrar procesos en primer plano en las siguientes subsecciones.
Iniciando un proceso
De forma predeterminada, los procesos se inician en primer plano. Esto significa que hasta que el programa salga o cambie de estado, no podrá interactuar con el shell.
Algunos comandos en primer plano salen muy rápido y lo devuelven al indicador de comandos casi inmediatamente. Por ejemplo, el siguiente comando se imprimirá Hello World
en la terminal y luego lo devolverá al indicador de comandos:
- echo "Hello World"
OutputHello World
Otros comandos en primer plano tardan más en ejecutarse, lo que bloquea el acceso al shell durante su ejecución. Esto puede deberse a que el comando está realizando una operación más extensa o a que está configurado para ejecutarse hasta que se detenga explícitamente o hasta que reciba otra entrada del usuario.
Un comando que se ejecuta indefinidamente es la top
utilidad. Después de iniciarse, continuará ejecutándose y actualizando su pantalla hasta que el usuario finalice el proceso:
- top
Puedes salir top
presionando q
, pero otros procesos no tienen una función dedicada a salir. Para detenerlos, tendrás que usar otro método.
Terminar un proceso
Supongamos que inicia un bash
bucle simple en la línea de comandos. A modo de ejemplo, el siguiente comando iniciará un bucle que se imprime Hello World
cada diez segundos. Este bucle continuará indefinidamente hasta que se finalice explícitamente:
- while true; do echo "Hello World"; sleep 10; done
A diferencia de top
, los bucles como este no tienen una tecla de “salir”. Tendrás que detener el proceso enviándole una señal . En Linux, el núcleo puede enviar señales a los procesos en ejecución como una solicitud para que salgan o cambien de estado. Las terminales Linux suelen estar configuradas para enviar la señal “SIGINT” (abreviatura de “señal de interrupción”) al proceso actual en primer plano cuando el usuario presiona la CTRL + C
combinación de teclas. La señal SIGINT le dice al programa que el usuario ha solicitado la finalización mediante el teclado.
Para detener el bucle que has iniciado, mantén presionada la CTRL
tecla y pulsa la C
tecla:
CTRL + C
El bucle saldrá y el control volverá al shell.
La señal SIGINT enviada por la CTRL + C
combinación es una de las muchas señales que se pueden enviar a los programas. La mayoría de las señales no tienen combinaciones de teclado asociadas y, en su lugar, deben enviarse mediante el kill
comando, que se tratará más adelante en esta guía.
Suspensión de procesos
Como se mencionó anteriormente, el proceso en primer plano bloqueará el acceso al shell durante su ejecución. ¿Qué sucede si inicia un proceso en primer plano, pero luego se da cuenta de que necesita acceder a la terminal?
Otra señal que puedes enviar es la señal “SIGTSTP”. SIGTSTP es la abreviatura de “signal terminal stop” (parada de terminal de señal) y suele representarse como la señal número 20. Cuando pulsas CTRL + Z
, tu terminal registra un comando de “suspensión”, que luego envía la señal SIGTSTP al proceso en primer plano. Básicamente, esto pausará la ejecución del comando y devolverá el control a la terminal.
Para ilustrarlo, utilice ping
para conectarse a google.com
cada 5 segundos. El siguiente comando precede al ping
comando con command
, lo que le permitirá omitir cualquier alias de shell que establezca artificialmente un recuento máximo en el comando:
- command ping -i 5 google.com
En lugar de terminar el comando con CTRL + C
, presione CTRL + Z
. Al hacerlo, obtendrá un resultado como este:
Output[1]+ Stopped ping -i 5 google.com
El ping
comando se ha detenido temporalmente, lo que le permite acceder nuevamente a un indicador de shell. Puede usar la ps
herramienta de proceso para mostrar esto:
- ps T
Output PID TTY STAT TIME COMMAND26904 pts/3 Ss 0:00 /bin/bash29633 pts/3 T 0:00 ping -i 5 google.com29643 pts/3 R+ 0:00 ps t
Esta salida indica que el ping
proceso todavía está en la lista, pero que la columna “STAT” tiene una “T”. Según la ps
página del manual, esto significa que un trabajo ha sido “detenido por [una] señal de control de trabajo”.
Esta guía describirá cómo cambiar los estados del proceso con mayor profundidad, pero por ahora puede reanudar la ejecución del comando en primer plano nuevamente escribiendo:
- fg
Una vez que el proceso se haya reanudado, termínelo con CTRL + C
:
Gestión de procesos en segundo plano
La principal alternativa a la ejecución de un proceso en primer plano es permitir que se ejecute en segundo plano. Un proceso en segundo plano se asocia con la terminal específica que lo inició, pero no bloquea el acceso al shell. En cambio, se ejecuta en segundo plano, lo que permite al usuario interactuar con el sistema mientras se ejecuta el comando.
Debido a la forma en que un proceso en primer plano interactúa con su terminal, solo puede haber un único proceso en primer plano por cada ventana de terminal. Debido a que los procesos en segundo plano devuelven el control al shell inmediatamente sin esperar a que el proceso se complete, muchos procesos en segundo plano pueden ejecutarse al mismo tiempo.
Procesos de inicio
Puede iniciar un proceso en segundo plano agregando un carácter ( ) al final de sus comandos. Esto le indica al shell que no espere a que se complete el proceso, sino que comience la ejecución y devuelva inmediatamente al usuario a un mensaje de solicitud. La salida del comando seguirá mostrándose en la terminal (a menos que se redirija ), pero puede escribir comandos adicionales a medida que continúa el proceso en segundo plano.
Por ejemplo, puedes iniciar el mismo ping
proceso desde la sección anterior en segundo plano escribiendo:
- command ping -i 5 google.com
El bash
sistema de control de trabajos devolverá una salida como esta:
Output[1] 4287
Luego recibirás la salida normal del ping
comando:
OutputPING google.com (74.125.226.71) 56(84) bytes of data.64 bytes from lga15s44-in-f7.1e100.net (74.125.226.71): icmp_seq=1 ttl=55 time=12.3 ms64 bytes from lga15s44-in-f7.1e100.net (74.125.226.71): icmp_seq=2 ttl=55 time=11.1 ms64 bytes from lga15s44-in-f7.1e100.net (74.125.226.71): icmp_seq=3 ttl=55 time=9.98 ms
Sin embargo, también puedes escribir comandos al mismo tiempo. La salida del proceso en segundo plano se mezclará con la entrada y la salida de los procesos en primer plano, pero no interferirá con la ejecución de los procesos en primer plano.
Listado de procesos en segundo plano
Para enumerar todos los procesos detenidos o en segundo plano, puede utilizar el jobs
comando:
- jobs
Si todavía tiene el ping
comando anterior ejecutándose en segundo plano, la jobs
salida del comando será similar a esta:
Output[1]+ Running command ping -i 5 google.com
Esto indica que actualmente tiene un solo proceso en segundo plano ejecutándose. Representa la especificación de trabajo[1]
del comando o el número de trabajo. Puede hacer referencia a esto con otros comandos de control de procesos y trabajos, como , y anteponiendo un signo de porcentaje al número de trabajo. En este caso, haría referencia a este trabajo como .kill
fg
bg
%1
Detener procesos en segundo plano
Puede detener el proceso en segundo plano actual de varias maneras. La forma más sencilla es usar el kill
comando con el número de trabajo asociado. Por ejemplo, puede detener el proceso en segundo plano que se está ejecutando escribiendo:
- kill %1
Dependiendo de cómo esté configurado su terminal, ya sea inmediatamente o la próxima vez que presione ENTER
, el estado de finalización del trabajo aparecerá en su salida:
Output[1]+ Terminated command ping -i 5 google.com
Si verifica el jobs
comando nuevamente, no habrá ningún trabajo actual.
Cambio de estados de proceso
Ahora que sabe cómo iniciar y detener procesos en segundo plano, puede aprender a cambiar su estado.
En esta guía ya se ha descrito una forma de cambiar el estado de un proceso: detenerlo o suspenderlo con CTRL + Z
. Cuando los procesos están en este estado detenido, puedes mover un proceso en primer plano al segundo plano o viceversa.
Trasladar los procesos del primer plano al segundo plano
Si olvida finalizar un comando al iniciarlo, aún puede mover el proceso a segundo plano.
El primer paso es detener el proceso CTRL + Z
nuevamente. Una vez que se detiene el proceso, puede usar el bg
comando para iniciarlo nuevamente en segundo plano:
- bg
Recibirá nuevamente la línea de estado del trabajo, esta vez con el símbolo adjunto:
Output[1]+ ping -i 5 google.com
De forma predeterminada, el bg
comando funciona en el proceso detenido más recientemente. Si ha detenido varios procesos seguidos sin volver a iniciarlos, puede hacer referencia a un proceso específico por su número de trabajo para mover el proceso correcto al segundo plano.
Tenga en cuenta que no todos los comandos pueden ejecutarse en segundo plano. Algunos procesos finalizarán automáticamente si detectan que se han iniciado con su entrada y salida estándar conectadas directamente a una terminal activa.
Trasladar los procesos en segundo plano al primer plano
También puedes mover procesos en segundo plano al primer plano escribiendo fg
:
- fg
Esto se aplica al último proceso que se puso en segundo plano (indicado por el símbolo +
en la jobs
salida del comando). Suspende inmediatamente el proceso y lo pone en primer plano. Para especificar un trabajo diferente, utilice su número de trabajo:
- fg %2
Una vez que un trabajo está en primer plano, puedes finalizarlo con CTRL + C
, dejar que se complete o suspenderlo y moverlo al segundo plano nuevamente.
Cómo tratar con los SIGHUP
Ya sea que un proceso esté en segundo plano o en primer plano, está estrechamente vinculado a la instancia de terminal que lo inició. Cuando una terminal se cierra, normalmente envía una señal SIGHUP a todos los procesos (en primer plano, en segundo plano o detenidos) que están vinculados a la terminal. Esto indica a los procesos que deben finalizar porque la terminal que los controla pronto no estará disponible.
Sin embargo, puede haber ocasiones en las que desee cerrar una terminal pero mantener los procesos en segundo plano en ejecución. Hay varias formas de lograr esto. Una de las formas más flexibles es usar un multiplexor de terminal como screen
o tmux
. Otra solución es usar una utilidad que proporcione la funcionalidad de separación de screen
y tmux
, como dtach
.
Sin embargo, esto no siempre es una opción. A veces, estos programas no están disponibles o ya has iniciado el proceso que necesitas para seguir ejecutándolo. A veces, incluso pueden resultar excesivos para lo que necesitas lograr.
Usandonohup
Si sabe al iniciar el proceso que desea cerrar la terminal antes de que el proceso se complete, puede iniciarlo mediante el nohup
comando . Esto hace que el proceso iniciado sea inmune a la señal SIGHUP. Continuará ejecutándose cuando se cierre la terminal y se reasignará como un elemento secundario del sistema init:
- nohup ping -i 5 google.com
Esto devolverá una línea como la siguiente, indicando que la salida del comando se escribirá en un archivo llamado nohup.out
:
Outputnohup: ignoring input and appending output to ‘nohup.out’
Este archivo se colocará en su directorio de trabajo actual si se puede escribir en él, pero de lo contrario se colocará en su directorio de inicio. Esto es para garantizar que no se pierda la salida si se cierra la ventana de terminal.
Si cierra la ventana de la terminal y abre otra, el proceso seguirá ejecutándose. No lo encontrará en la salida del jobs
comando porque cada instancia de la terminal mantiene su propia cola de trabajos independiente. Si cierra la terminal, el ping
trabajo se destruirá aunque el ping
proceso siga ejecutándose.
Para matar el ping
proceso, tendrás que encontrar su ID de proceso (o “PID”). Puedes hacerlo con el pgrep
comando (también hay un pkill
comando, pero este método de dos partes garantiza que solo estás matando el proceso deseado). Usa pgrep
y la -a
bandera para buscar el ejecutable:
- pgrep -a ping
Output7360 ping -i 5 google.com
Luego puede matar el proceso haciendo referencia al PID devuelto, que es el número en la primera columna:
- kill 7360
Es posible que desees eliminar el nohup.out
archivo si ya no lo necesitas.
Usandodisown
El nohup
comando es útil, pero solo si sabe que lo necesitará en el momento de iniciar el proceso. El bash
sistema de control de trabajos ofrece otros métodos para lograr resultados similares con el comando integrado disown
.
El disown
comando, en su configuración predeterminada, elimina un trabajo de la cola de trabajos de una terminal. Esto significa que ya no se puede administrar mediante los mecanismos de control de trabajos que se analizaron anteriormente en esta guía, como fg
, bg
, CTRL + Z
, CTRL + C
. En cambio, el trabajo se eliminará inmediatamente de la lista en la jobs
salida y ya no se asociará con la terminal.
El comando se llama especificando un número de trabajo. Por ejemplo, para rechazar inmediatamente el trabajo 2, podría escribir:
- disown %2
Esto deja el proceso en un estado similar al de un nohup
proceso después de que se ha cerrado la terminal de control. La excepción es que cualquier salida se perderá cuando se cierre la terminal de control si no se está redirigiendo a un archivo.
Por lo general, no desea eliminar el proceso por completo del control de tareas si no cierra inmediatamente la ventana de la terminal. En cambio, puede pasar la -h
bandera al disown
proceso para marcarlo para que ignore las señales SIGHUP, pero que continúe como un trabajo normal:
- disown -h %1
En este estado, podrías usar los mecanismos de control de tareas normales para continuar controlando el proceso hasta cerrar la terminal. Al cerrar la terminal, volverás a quedarte atascado con un proceso sin salida si no lo redirigiste a un archivo al iniciarlo.
Para solucionar este problema, puedes intentar redirigir la salida de tu proceso una vez que ya se esté ejecutando. Esto queda fuera del alcance de esta guía, pero en esta publicación se explica cómo puedes hacerlo.
Uso de la huponexitopción Shell
bash
Tiene otra forma de evitar el problema SIGHUP para los procesos secundarios. La huponexit
opción de shell controla si bash
se enviará la señal SIGHUP a los procesos secundarios cuando salga.
Nota : La huponexit
opción solo afecta el comportamiento de SIGHUP cuando se inicia la finalización de una sesión de shell desde el propio shell . Algunos ejemplos de cuándo se aplica esto son cuando se presiona el exit
comando o dentro de la sesión.CTRL + D
Cuando se finaliza una sesión de shell a través del propio programa de terminal (cerrando la ventana, etc.), el comando nohuponexit
tendrá efecto. En lugar de decidir si se envía o no la señal SIGHUP, el propio terminal enviará la señal SIGHUP a , que luego propagará correctamente la señal a sus procesos secundarios.bash
bash
A pesar de las advertencias mencionadas anteriormente, la huponexit
opción es quizás una de las más fáciles de manejar. Puede determinar si esta función está activada o desactivada escribiendo:
- shopt huponexit
Para activarlo, escriba:
- shopt -s huponexit
Ahora, si sales de tu sesión escribiendo exit
, todos tus procesos continuarán ejecutándose:
- exit
Esto tiene las mismas advertencias sobre la salida del programa que la última opción, así que asegúrese de haber redirigido la salida de sus procesos antes de cerrar su terminal si esto es importante.
Conclusión
Aprender a controlar tareas y a gestionar procesos en primer y segundo plano le proporcionará una mayor flexibilidad a la hora de ejecutar programas en la línea de comandos. En lugar de tener que abrir muchas ventanas de terminal o sesiones SSH, a menudo puede solucionar el problema deteniendo los procesos antes de tiempo o trasladándolos al segundo plano según sea necesario.
Deja una respuesta