Ejecución en Segundo Plano en Linux

LinuxBeginner
Practicar Ahora

Introducción

Linux proporciona potentes capacidades para la gestión de procesos, permitiendo 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 supervisión constante. En este laboratorio, aprenderá a ejecutar procesos en segundo plano, verificar su estado y gestionarlos de manera efectiva. Estas habilidades son fundamentales para cualquier usuario de Linux y brindan una mayor flexibilidad al trabajar en entornos de línea de comandos.

Comprendiendo 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, impidiendo que ejecutes otros comandos. Un proceso en segundo plano, sin embargo, se ejecuta sin bloquear tu terminal, permitiéndote 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

Añade el siguiente contenido al archivo:

#!/bin/bash
## This script simulates a long-running task
echo "Starting long task..."
for i in {1..20}; do
  echo "Processing step $i..."
  sleep 5
done
echo "Long task completed."

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

Haz que el script sea 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 5 segundos. Observa que durante este tiempo, no puedes introducir 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.

Ejecutando Procesos en Segundo Plano

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

Ejecutemos 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 trabajo (job number) asignado por el shell, y 1234 es el ID del proceso (PID). El número de trabajo se utiliza para referirse a este proceso en segundo plano dentro del shell, mientras que el PID es utilizado por el sistema operativo para identificar el proceso.

Observa que después de la salida inicial, recuperas tu prompt de comandos. Ahora puedes continuar introduciendo 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 seguir 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.

Nota Importante: Es completamente normal ver la salida del proceso en segundo plano apareciendo en tu terminal. Cuando ejecutas un proceso en segundo plano usando &, el proceso se ejecuta en segundo plano, pero sus flujos de salida (stdout y stderr) todavía están conectados a tu terminal. Esto significa:

  • El proceso se está ejecutando en segundo plano (puedes introducir otros comandos)
  • El proceso continúa ejecutándose sin bloquear tu terminal
  • La salida todavía aparece en tu pantalla (lo que puede mezclarse con tus otros comandos)

Este comportamiento es el esperado y demuestra que el proceso en segundo plano se está ejecutando activamente y produciendo salida.

Comprobando 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.

Usando el Comando jobs

El comando jobs muestra el estado de todos los trabajos en segundo plano en la sesión de shell actual:

jobs

Deberías ver una salida similar a:

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

El signo + indica que este es el trabajo predeterminado actual, lo que significa que se operará sobre él si utilizas comandos como fg o bg sin especificar un número de trabajo.

Usando el Comando ps

Mientras que jobs solo muestra los procesos iniciados desde el shell actual, el comando ps puede mostrar todos los procesos que se ejecutan en el sistema:

ps aux | grep long-task.sh

La salida debería 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

Creemos otro proceso en segundo plano para poder ver múltiples trabajos:

cd ~/project
nano another-task.sh

Añade el siguiente contenido:

#!/bin/bash
## This script simulates another task
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 que el script sea ejecutable:

chmod +x another-task.sh

Ejecuta también este script en segundo plano:

./another-task.sh &

Ahora verifica tus trabajos en segundo plano nuevamente:

jobs

Deberías ver ambos trabajos listados:

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

Gestionando Procesos en Segundo Plano

Ahora que tenemos procesos ejecutándose en segundo plano, aprendamos a gestionarlos. Linux proporciona varios comandos para controlar los procesos en segundo plano:

Trayendo un Proceso en Segundo Plano al Primer Plano

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

Traigamos nuestro primer trabajo al primer plano:

fg %1

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

Para interrumpir el proceso y volver al prompt de comandos, presiona Ctrl+C.

Enviando 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 usa el comando bg para continuarlo 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úalo en segundo plano:

bg

El proceso se reanudará ejecutándose en segundo plano, y verás:

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

Puedes verificar que se está ejecutando con:

jobs

Terminando Procesos en Segundo Plano

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

kill %1

O usando el PID (reemplaza 1234 con el PID real de tu salida de ps):

kill 1234

Para verificar que el proceso ha sido terminado:

jobs

Podrías ver un mensaje indicando que el trabajo fue terminado:

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

Ejecutando Procesos Después del Cierre de Sesión

A veces necesitas que un proceso continúe 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 del shell.

Creemos un script que se ejecutará durante mucho tiempo:

cd ~/project
nano persistent-task.sh

Añade el siguiente contenido:

#!/bin/bash
## This script runs for a very long time
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 que el script sea 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 continuará incluso si cierras sesión. La salida que normalmente iría a la terminal se redirige a un archivo llamado nohup.out.

Consejo para Gestionar la Salida: Si no quieres que la salida del proceso en segundo plano aparezca en tu terminal y potencialmente interfiera con tu trabajo, puedes redirigir la salida a un archivo:

## Redirigir la salida a un archivo específico
./long-task.sh > task-output.log 2>&1 &

## O redirigir a /dev/null para descartar la salida por completo
./long-task.sh > /dev/null 2>&1 &

El 2>&1 redirige tanto la salida estándar como la salida de error. De esta manera, el proceso en segundo plano se ejecuta silenciosamente sin saturar tu terminal.

Puedes comprobar 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 usar el comando disown. Primero, ejecuta un proceso en segundo plano:

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

Luego usa disown para desvincularlo de la terminal:

disown %1

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

Estos comandos son esenciales al ejecutar tareas en servidores remotos donde necesitas que los procesos continúen después de desconectarte.

Resumen

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

  1. Creación y ejecución de scripts tanto en modo de primer plano como en segundo plano
  2. Ejecución de procesos en segundo plano utilizando el operador &
  3. Comprobación del estado de los procesos en segundo plano utilizando jobs y ps
  4. Gestión de procesos con los comandos fg y bg para moverlos entre primer plano y segundo plano
  5. Terminación de procesos en segundo plano utilizando el comando kill
  6. Ejecución de procesos que continúan después de cerrar sesión utilizando nohup y disown

Estas habilidades son fundamentales para trabajar de manera eficiente en entornos Linux, especialmente al tratar con tareas de larga duración o al trabajar 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.