Ejecución en segundo plano en Linux

LinuxLinuxBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

Linux ofrece capacidades poderosas para la gestión de procesos, lo que permite a los usuarios ejecutar comandos en segundo plano mientras continúan trabajando en la terminal. Esta funcionalidad es esencial cuando se trata de tareas que consumen mucho tiempo y no requieren una supervisión constante. En este laboratorio (lab), aprenderás cómo ejecutar procesos en segundo plano, verificar su estado y administrarlos de manera efectiva. Estas habilidades son fundamentales para cualquier usuario de Linux y brindan mayor flexibilidad al trabajar en entornos de línea de comandos.

Comprender los procesos en segundo plano

En Linux, los procesos pueden ejecutarse en primer plano (foreground) o en segundo plano (background). Un proceso en primer plano es aquel que ocupa tu terminal hasta que se completa, lo que te impide ejecutar otros comandos. Sin embargo, un proceso en segundo plano se ejecuta sin bloquear tu terminal, lo que te permite continuar usando la línea de comandos.

Primero, creemos un script simple que simule una tarea de larga duración. Esto nos ayudará a demostrar los procesos en segundo plano.

Navega al directorio del proyecto:

cd ~/project

Crea un archivo llamado long-task.sh usando el editor nano:

nano long-task.sh

Agrega el siguiente contenido al archivo:

#!/bin/bash
## Este script simula una tarea de larga duración
echo "Starting long task..."
for i in {1..10}; do
  echo "Processing step $i..."
  sleep 3
done
echo "Long task completed."

Presiona Ctrl+O y luego Enter para guardar el archivo, luego Ctrl+X para salir de nano.

Haz el script ejecutable cambiando sus permisos:

chmod +x long-task.sh

Ahora, ejecuta el script en primer plano:

./long-task.sh

Verás que el script muestra cada paso con un retraso de 3 segundos. Observa que durante este tiempo, no puedes ingresar otros comandos en la terminal porque el proceso se está ejecutando en primer plano.

Presiona Ctrl+C para terminar el script antes de que se complete.

Ejecutar procesos en segundo plano

Para ejecutar un proceso en segundo plano, simplemente agrega un ampersand (&) al final del comando. Esto le indica a la shell que ejecute el comando en segundo plano.

Vamos a ejecutar nuestro script long-task.sh en segundo plano:

cd ~/project
./long-task.sh &

Deberías ver una salida similar a la siguiente:

[1] 1234
Starting long task...
Processing step 1...

Aquí, [1] es el número de tarea (job number) asignado por la shell, y 1234 es el ID de proceso (PID, por sus siglas en inglés). El número de tarea se utiliza para hacer referencia a este proceso en segundo plano dentro de la shell, mientras que el PID es utilizado por el sistema operativo para identificar el proceso.

Observa que después de la salida inicial, obtienes de vuelta el indicador de comando. Ahora puedes continuar ingresando otros comandos mientras el script se ejecuta en segundo plano.

Por ejemplo, intenta crear otro archivo:

echo "I can do other work while the script runs" > background-demo.txt
cat background-demo.txt

Verás que puedes continuar trabajando en la terminal mientras ocasionalmente ves la salida del script en segundo plano. Esto es muy útil para ejecutar tareas que consumen mucho tiempo sin bloquear tu sesión de terminal.

Verificar procesos en segundo plano

Linux proporciona varios comandos para verificar qué procesos se están ejecutando en segundo plano. Los dos más comunes son jobs y ps.

Usar el comando jobs

El comando jobs muestra el estado de todas las tareas en segundo plano en la sesión actual de la shell:

jobs

Deberías ver una salida similar a:

[1]+  Running    ./long-task.sh &

El signo + indica que esta es la tarea predeterminada actual, lo que significa que se operará sobre ella si se utilizan comandos como fg o bg sin especificar un número de tarea.

Usar el comando ps

Mientras que jobs solo muestra los procesos iniciados desde la shell actual, el comando ps puede mostrar todos los procesos en ejecución en el sistema:

ps aux | grep long-task.sh

La salida debe incluir una línea para tu script en segundo plano:

labex     1234  0.0  0.0   4508  1996 pts/0    S    12:34   0:00 /bin/bash ./long-task.sh

Vamos a crear otro proceso en segundo plano para que podamos ver múltiples tareas:

cd ~/project
nano another-task.sh

Agrega el siguiente contenido:

#!/bin/bash
## Este script simula otra tarea
echo "Starting another task..."
for i in {1..20}; do
  echo "Another task - step $i..."
  sleep 5
done
echo "Another task completed."

Guarda y sal de nano (Ctrl+O, Enter, Ctrl+X), luego haz el script ejecutable:

chmod +x another-task.sh

Ejecuta este script también en segundo plano:

./another-task.sh &

Ahora verifica tus tareas en segundo plano nuevamente:

jobs

Deberías ver ambas tareas enumeradas:

[1]-  Running    ./long-task.sh &
[2]+  Running    ./another-task.sh &

Administrar procesos en segundo plano

Ahora que tenemos procesos en ejecución en segundo plano, aprendamos cómo administrarlos. Linux proporciona varios comandos para controlar los procesos en segundo plano:

Traer un proceso en segundo plano al primer plano

El comando fg trae un proceso en segundo plano al primer plano. Si tienes múltiples tareas en segundo plano, puedes especificar cuál utilizar su número de tarea.

Vamos a traer nuestra primera tarea al primer plano:

fg %1

El %1 se refiere al número de tarea 1. Verás que la salida del script long-task.sh ahora aparece en tu terminal, y tu indicador de comando no estará disponible hasta que el proceso se complete o lo detengas.

Para interrumpir el proceso y volver al indicador de comando, presiona Ctrl+C.

Enviar un proceso en primer plano al segundo plano

También puedes enviar un proceso en primer plano al segundo plano. Primero, suspende el proceso en primer plano con Ctrl+Z, luego utiliza el comando bg para continuar su ejecución en segundo plano.

Inicia un nuevo proceso en primer plano:

cd ~/project
./long-task.sh

Después de unos segundos, presiona Ctrl+Z para suspender el proceso. Verás un mensaje como:

[1]+  Stopped    ./long-task.sh

Ahora, continúa su ejecución en segundo plano:

bg

El proceso reanudará su ejecución en segundo plano, y verás:

[1]+ ./long-task.sh &

Puedes verificar que está en ejecución con:

jobs

Terminar procesos en segundo plano

Para terminar un proceso en segundo plano, puedes utilizar el comando kill con el número de tarea o el ID de proceso:

kill %1

O utilizando el PID (reemplaza 1234 con el PID real de la salida de tu comando ps):

kill 1234

Para verificar que el proceso se ha terminado:

jobs

Puedes ver un mensaje que indica que la tarea se ha terminado:

[1]+  Terminated    ./long-task.sh

Ejecutar procesos después de cerrar sesión

A veces necesitas que un proceso siga ejecutándose incluso después de cerrar sesión en la terminal. El comando nohup te permite ejecutar un comando que seguirá ejecutándose incluso después de salir de la shell.

Vamos a crear un script que se ejecutará durante mucho tiempo:

cd ~/project
nano persistent-task.sh

Agrega el siguiente contenido:

#!/bin/bash
## Este script se ejecuta durante un tiempo muy largo
echo "Starting persistent task at $(date)" > persistent-output.log
for i in {1..100}; do
  echo "Iteration $i at $(date)" >> persistent-output.log
  sleep 10
done
echo "Persistent task completed at $(date)" >> persistent-output.log

Guarda y sal de nano, luego haz el script ejecutable:

chmod +x persistent-task.sh

Ahora, ejecútalo con nohup y ponlo en segundo plano:

nohup ./persistent-task.sh &

Verás una salida similar a:

[1] 5678
nohup: ignoring input and appending output to 'nohup.out'

Esto significa que el proceso se está ejecutando en segundo plano y seguirá ejecutándose incluso si cierras sesión. La salida que normalmente iría a la terminal se redirige a un archivo llamado nohup.out.

Puedes verificar si el proceso se está ejecutando:

ps aux | grep persistent-task.sh

Y puedes examinar el archivo de salida:

cat persistent-output.log

La salida muestra la hora de inicio y las iteraciones de la tarea persistente.

El comando disown

Otra forma de mantener los procesos en ejecución después de cerrar sesión es utilizar el comando disown. Primero, ejecuta un proceso en segundo plano:

cd ~/project
./persistent-task.sh &

Luego utiliza disown para desvincularlo de la terminal:

disown %1

Ahora este proceso seguirá ejecutándose incluso si cierras la terminal.

Estos comandos son esenciales cuando se ejecutan tareas en servidores remotos donde se necesita que los procesos continúen después de desconectarse.

Resumen

En este laboratorio, has aprendido habilidades esenciales de Linux para administrar procesos en segundo plano. Has practicado:

  1. Crear y ejecutar scripts en modo primer plano y segundo plano
  2. Ejecutar procesos en segundo plano utilizando el operador &
  3. Verificar el estado de los procesos en segundo plano utilizando jobs y ps
  4. Administrar procesos con los comandos fg y bg para moverlos entre el primer plano y el segundo plano
  5. Terminar procesos en segundo plano utilizando el comando kill
  6. Ejecutar procesos que continúen después de cerrar sesión utilizando nohup y disown

Estas habilidades son fundamentales para trabajar de manera eficiente en entornos Linux, especialmente cuando se tratan con tareas de larga duración o cuando se trabaja en servidores remotos. Al ejecutar procesos en segundo plano, puedes maximizar tu productividad ejecutando múltiples tareas simultáneamente sin bloquear tu sesión de terminal.