El comando jobs en Linux: listar trabajos en segundo plano

Introducción

En el entorno de la línea de comandos de Linux, es común lanzar procesos que continúan ejecutándose mientras seguimos trabajando en la terminal. Estos procesos pueden permanecer en primer plano o pasar a segundo plano, lo que nos permite seguir tecleando comandos sin esperar a que finalicen. El comando jobs es una herramienta integrada en la mayoría de los shells (como Bash y Zsh) que muestra la lista de esos trabajos en segundo plano, indicando su estado y número de identificación. Conocer su uso es fundamental para administrar eficientemente múltiples tareas desde una sola sesión.

¿Qué es un trabajo en segundo plano?

Un trabajo en segundo plano es cualquier proceso que se inicia desde la shell y se coloca en modo de ejecución sin bloquear la entrada estándar de la terminal. Al añadir un ampersand (&) al final de un comando, le indicamos al shell que lo ejecute en segundo plano y devuelva inmediatamente el prompt. Los trabajos pueden estar en distintos estados: corriendo, detenidos (por ejemplo, al enviar SIGTSTP con Ctrl+Z) o finalizados. El shell mantiene una tabla interna de trabajos donde cada uno recibe un número de trabajo (job ID) distinto del PID del proceso, lo que facilita su referencia mediante el símbolo % seguido del número.

Sintaxis del comando jobs

La sintaxis básica del comando jobs es muy sencilla:

jobs [opciones] [jobID…]

Si no se especifica ninguna opción ni jobID, jobs muestra todos los trabajos conocidos por la shell actual. Las opciones más habituales permiten filtrar la salida, mostrar el PID asociado o cambiar el formato de visualización. A continuación se describen las opciones más útiles y algunos ejemplos prácticos que ilustran su uso cotidiano.

Opciones más útiles

  • -l: Lista el PID de cada trabajo junto con su número de job y su estado. Muy útil cuando necesitas saber el identificador del proceso para enviarle señales con kill.
  • -n: Muestra solo los trabajos que han cambiado de estado desde la última notificación. Ideal para scripts que desean reaccionar a cambios sin procesar toda la lista.
  • -p: Muestra únicamente el PID de cada trabajo, uno por línea, lo que facilita su captura en tuberías.
  • -r: Restringe la salida a los trabajos que están actualmente en ejecución (running).
  • -s: Muestra solo los trabajos que están detenidos (stopped).

Estas opciones pueden combinarse; por ejemplo, jobs -l -r muestra el PID y el número de job de los procesos en ejecución.

Ejemplos prácticos

Imagina que estás compilando un proyecto grande y deseas continuar editando archivos mientras la compilación avanza. Puedes lanzar la compilación en segundo plano:

make &

Luego, con jobs ves algo como:

[1] + 12345 running make

El número entre corchetes es el job ID (1) y el símbolo + indica el trabajo al que se volverá si se ejecuta fg sin argumentos. Si deseas ver el PID, usa:

jobs -l

Salida:

[1] + 12345 running make

Si envías el trabajo a segundo plano después de detenerlo con Ctrl+Z, puedes retomarlo con:

bg %1

Y para traerlo de nuevo al primer plano:

fg %1

Otro caso típico es ejecutar un servidor de desarrollo en segundo plano:

python3 -m http.server 8000 &

Luego puedes comprobar su estado con jobs y, cuando ya no lo necesites, detenerlo con kill %1 o llevarlo al primer plano y finalizarlo con Ctrl+C.

Gestionar trabajos con fg y bg

El comando jobs solo lista; para interactuar con los trabajos se usan fg (foreground) y bg (background). fg %n lleva el trabajo n al primer plano, permitiéndote interactuar directamente con él. Si se omite el número, fg actúa sobre el trabajo marcado con + (el último que estuvo en segundo plano). Por el contrario, bg %n reanuda un trabajo detenido en segundo plano. Estos comandos son especialmente útiles cuando, tras pulsar Ctrl+Z, deseas continuar la ejecución sin bloquear la terminal. Recuerda que fg y bg solo funcionan sobre trabajos controlados por la shell actual; no afectan a procesos iniciados fuera de ella.

Buenas prácticas y consejos

  • Siempre verifica la salida de jobs antes de matar un trabajo; usar kill %n es más seguro que kill porque evita equivocarse si el PID ha sido reutilizado.
  • En scripts, combina jobs -p con read para capturar los PIDs de trabajos específicos y actuar sobre ellos.
  • Evita dejar trabajos en segundo plano indefinidamente; si ya no los necesitas, finalízalos para liberar recursos.
  • En entornos de producción, considera usar herramientas como nohup o disown para separar procesos de la terminal y evitar que reciban SIGHUP al cerrar la sesión.
  • Aprovecha la opción -n de jobs en bucles de monitoreo para detectar cambios de estado sin sobrecargar la CPU.

Conclusión

El comando jobs es una pieza esencial del arsenal de cualquier usuario de Linux que trabaja con la terminal. Su simplicidad permite obtener rápidamente una visión clara de los procesos en segundo plano, mientras que sus opciones y la combinación con fg y bg brindan un control preciso sobre su ejecución. Dominar jobs no solo mejora la productividad al evitar esperas innecesarias, sino que también contribuye a una administración más ordenada y segura de los recursos del sistema. La próxima vez que lances un proceso con &, recuerda consultar jobs para mantener todo bajo control.