El comando bg y fg en Linux: gestionar procesos en segundo plano

Introducción

En sistemas tipo Unix, cada comando que se ejecuta desde la terminal crea un proceso. Por defecto, esos procesos se ejecutan en primer plano, lo que significa que la shell espera a que terminen antes de aceptar nuevas órdenes. Sin embargo, hay situaciones en las que resulta útil dejar que un proceso continúe ejecutándose mientras seguimos trabajando en la terminal. Para ello Linux dispone de los comandos bg y fg, que permiten mover procesos entre primer plano y segundo plano.

Qué son los procesos en primer y segundo plano

Un proceso en primer plano bloquea la terminal: no se puede escribir ningún otro comando hasta que finalice o se suspende. Un proceso en segundo plano, en cambio, sigue ejecutándose pero la shell vuelve a estar disponible inmediatamente. Esto se logra mediante la suspensión (con Ctrl+Z) y la posterior reanudación en segundo plano con bg, o bien lanzando directamente el proceso con el operador & al final de la línea.

Cómo enviar un proceso a segundo plano con & y bg

La forma más sencilla de iniciar un proceso en segundo plano es añadir el símbolo & al final del comando. Por ejemplo:

$ find / -name "*.log" 2>/dev/null &
[1] 12345

La shell muestra el número de trabajo (entre corchetes) y el PID. El proceso continúa ejecutándose mientras la terminal queda libre para otros comandos.

Si ya tienes un proceso en ejecución y deseas pasarlo a segundo plano sin terminarlo, primero lo suspendes con Ctrl+Z. La shell mostrará algo como:

$ find / -name "*.tmp" 2>/dev/null
^Z
[1]+  Stopped                 find / -name "*.tmp" 2>/dev/null

Luego, con el comando bg le indicas que continúe su ejecución en segundo plano:

$ bg
[1]+ find / -name "*.tmp" 2>/dev/null &

A partir de ese momento el proceso sigue corriendo y la terminal está disponible.

Traer un proceso al primer plano con fg

Cuando necesitas interactuar nuevamente con un proceso que está en segundo plano (por ejemplo, para proporcionar entrada o ver su salida en tiempo real), lo traes al primer plano usando fg. Si solo hay un trabajo en segundo plano, basta con escribir:

$ fg

Si hay varios trabajos, puedes especificar el número de trabajo:

$ fg %2

El proceso volverá a bloquear la terminal hasta que finalice o lo suspendas nuevamente con Ctrl+Z.

Ejemplos prácticos

  • Compresión de archivos en segundo plano: $ tar -czf copia.tar.gz /home/usuario/documentos &
  • Ejecución de un script largo y seguimiento de su salida:
    $ ./script_largo.sh
    ^Z
    [1]+ Stopped                 ./script_largo.sh
    $ bg
    [1]+ ./script_largo.sh &
    $ jobs
    [1]+  Running                 ./script_largo.sh &
    $ fg
    
  • Cambiar entre múltiples trabajos:
    $ ping -c 100 8.8.8.8 &
    [1] 6789
    $ sleep 60 &
    [2] 6790
    $ jobs
    [1]-  Running                 ping -c 100 8.8.8.8 &
    [2]+  Running                 sleep 60 &
    $ fg %1   # trae el ping al primer plano
    ^Z
    [1]+  Stopped                 ping -c 100 8.8.8.8
    $ bg %1   # lo vuelve a segundo plano
    [1]+ ping -c 100 8.8.8.8 &
    

Consideraciones y buenas prácticas

  • Los procesos en segundo plano siguen consumiendo recursos de CPU y memoria; vigila su uso en sistemas con limitaciones.
  • Los trabajos que intentan leer desde la entrada estándar (stdin) se detendrán automáticamente cuando intenten leer y no haya datos disponibles; en esos casos es necesario llevarlos al primer plano para proporcionar la entrada.
  • Utiliza el comando jobs para listar los trabajos actuales y sus estados.
  • Si cierras la terminal mientras hay trabajos en segundo plano, estos recibirán la señal SIGHUP y se terminarán, a menos que los hayas desasociado con disown o los hayas iniciado con nohup.
  • Para procesos que deben seguir ejecutándose después de cerrar la sesión, combina nohup con & o usa disown después de ponerlos en segundo plano.

Conclusión

Dominar los comandos bg y fg te permite gestionar de forma eficiente la ejecución de tareas largas o que no requieren interacción constante, manteniendo la terminal libre para otras operaciones. Aprender a suspender, reanudar y cambiar entre primer y segundo plano es una habilidad fundamental para cualquier usuario o administrador de Linux que quiera trabajar de manera productiva desde la línea de comandos.