Control de trabajos y procesos en la terminal
🎯 Objetivo del módulo Pausar, reanudar y supervisar comandos lanzados desde una shell interactiva, distinguiendo trabajos de la shell y procesos del sistema.
1. Proceso, PID y trabajo #
Un proceso es un programa en ejecución identificado por un PID. Un trabajo (job) es una tubería o comando que la shell interactiva controla y muestra mediante un identificador como %1.
1sleep 300 & 2jobs
Salida orientativa:
1[1]+ Running sleep 300 &
1 es el número de trabajo. El proceso tendrá además su propio PID.
2. Primer plano y segundo plano #
Un proceso en primer plano recibe normalmente la entrada del terminal. Un trabajo en segundo plano permite seguir usando el prompt.
1comando &
$! contiene el PID del último proceso iniciado en segundo plano:
1sleep 60 & 2echo "$!"
3. Atajos fundamentales #
| Atajo | Efecto habitual |
|---|---|
Ctrl+C | envía SIGINT al trabajo en primer plano |
Ctrl+Z | envía SIGTSTP y suspende el trabajo |
Ctrl+D | indica fin de entrada; no es una señal |
Una aplicación puede gestionar o ignorar algunas señales. Ctrl+D solo representa EOF cuando la shell o el programa está leyendo entrada.
4. jobs, fg y bg #
Listar trabajos #
1jobs 2jobs -l
-l muestra también los PID.
Reanudar en segundo plano #
Después de suspender un comando con Ctrl+Z:
1bg %1
Llevar al primer plano #
1fg %1
Sin indicar número, fg y bg actúan sobre el trabajo actual.
5. Esperar trabajos #
wait detiene la shell hasta que termine un proceso o trabajo y devuelve su código de salida.
1tarea_larga & 2pid=$! 3wait "$pid" 4echo "Código: $?"
Es especialmente útil en scripts que lanzan varias tareas concurrentes.
6. Señales y finalización ordenada #
Consulta las señales disponibles:
1kill -l
Finaliza primero de forma ordenada con SIGTERM:
1kill PID 2kill -TERM PID
Solo si el proceso no responde:
1kill -KILL PID
SIGKILL no puede ser capturada y no permite que el proceso limpie recursos o guarde datos.
Para seleccionar por nombre pueden resultar útiles pgrep y pkill:
1pgrep -a nginx 2pkill -TERM nombre_proceso
Revisa siempre las coincidencias antes de usar pkill.
7. nohup y cierre de la terminal #
& por sí solo no garantiza que un proceso sobreviva al cierre de la sesión. nohup hace que el comando ignore SIGHUP y redirige la salida si sigue conectada al terminal.
1nohup ./proceso_largo.sh > proceso.log 2>&1 &
Para servicios persistentes y reinicios automáticos es preferible un gestor como systemd, no nohup.
8. disown en Bash #
disown elimina un trabajo de la tabla de trabajos de la shell. Con -h, Bash conserva el trabajo en la tabla pero evita enviarle SIGHUP al salir.
1comando_largo & 2disown -h %1
Es una función de la shell, no un sustituto de un servicio correctamente administrado.
9. Flujo de recuperación habitual #
1comando largo 2Ctrl+Z 3jobs 4bg %1 5fg %1
Este flujo suspende el comando, comprueba el trabajo, lo reanuda en segundo plano y finalmente lo recupera en primer plano.
Resumen del tema
jobsmuestra trabajos de la shell;psmuestra procesos del sistema.Ctrl+Zsuspende,bgreanuda en segundo plano yfgrecupera el primer plano.- Usa
SIGTERMantes queSIGKILL. nohuppuede conservar una tarea puntual, pero los servicios deben gestionarse con systemd.