Procesos, señales y subshells en Bash
Un proceso es cualquier programa en ejecución. Bash puede lanzar, controlar, detener y terminar procesos, e incluso reaccionar a señales del sistema.
1. Procesos en primer y segundo plano #
Por defecto, un comando se ejecuta en primer plano (bloquea la terminal):
1sleep 5
👉 No podrás escribir otro comando hasta que termine.
Enviar un proceso al segundo plano (&) #
1sleep 10 &
👉 El & ejecuta el comando en background (no bloquea la terminal).
Ver procesos en segundo plano en la sesión actual:
1jobs
Traer un proceso al primer plano:
1fg %1
Enviar al segundo plano de nuevo:
1bg %1
2. Obtener PID de un proceso #
Cada proceso tiene un PID (Process ID).
Ejecuta:
1sleep 30 & 2echo "PID: $!"
👉 $! guarda el PID del último proceso en segundo plano.
3. Listar procesos #
1ps 2ps aux # Lista más completa
Filtrar procesos por nombre:
1ps aux | grep "sleep"
4. Matar procesos #
Terminar un proceso con kill (requiere PID):
1kill 1234
Forzar finalización:
1kill -9 1234
5. Señales más comunes #
| Señal | Número | Uso principal |
|---|---|---|
SIGINT | 2 | Interrumpir (Ctrl+C) |
SIGTERM | 15 | Finalización controlada |
SIGKILL | 9 | Finalización forzada |
SIGHUP | 1 | Reinicio de configuración |
EXIT | — | Evento al salir del script |
👉 Podemos atrapar señales con trap.
6. Usar trap para reaccionar a señales #
Ejemplo: limpiar un archivo temporal al salir del script:
1#!/usr/bin/env bash 2set -Eeuo pipefail 3 4TMP=$(mktemp) 5echo "Archivo temporal: $TMP" 6 7trap 'echo "Limpiando..."; rm -f "$TMP"' EXIT 8 9echo "Procesando..." 10sleep 5 11echo "Finalizado"
👉 Si presionas Ctrl+C durante el sleep, el trap se ejecutará y eliminará el archivo temporal.
7. Subshells #
Un subshell es un proceso hijo que ejecuta un bloque de comandos aislado del shell principal.
Sintaxis:
1( comando1; comando2 )
Diferencia entre subshell y agrupación normal #
1VAR=10 2( VAR=20; echo "Dentro del subshell: $VAR" ) 3echo "Fuera del subshell: $VAR"
Salida:
Dentro del subshell: 20
Fuera del subshell: 10
👉 El cambio de variable no afecta al shell padre.
Redirección de todo un bloque #
1( 2 echo "Línea 1" 3 echo "Línea 2" 4) > salida.txt
👉 Todo el bloque se escribe en el archivo.
8. coproc: ejecutar comandos en paralelo #
Ejemplo: lanzar un proceso en paralelo y comunicarse con él:
1coproc date 2cat <&"${COPROC[0]}"
Es avanzado, pero útil para tareas de procesamiento en segundo plano.
9. Ejercicio práctico 1 #
Crea un script monitoreo.sh que:
- Ejecute un proceso en segundo plano que escriba cada 2 segundos en un archivo
log.txt. - Use
trappara capturarSIGINT(Ctrl+C) y detener el proceso de forma controlada. - Al finalizar, muestre cuántas líneas se escribieron en
log.txt.
10. Ejercicio práctico 2 #
Crea un script procesos_activos.sh que:
- Muestre los 5 procesos que más memoria consumen (
ps aux --sort=-%mem). - Pregunte al usuario si quiere terminar alguno indicando su PID.
- Si el usuario confirma, envíe una señal
SIGTERMal proceso elegido.
11. Ejercicio práctico 3 #
Crea un script tareas_paralelas.sh que:
- Use tres subshells para realizar tareas simuladas (por ejemplo,
sleep 2y luego imprimir un mensaje). - Cada tarea debe ejecutarse en paralelo.
- Al final, mostrar el tiempo total de ejecución.
👉 Pista: Usa & para paralelizar y wait para esperar a que terminen.
12. Buenas prácticas #
- ✅ Usa
trappara limpiar recursos temporales al salir. - ✅ Evita
kill -9a menos que sea estrictamente necesario. - ✅ Usa
jobs,fg,bgpara depurar en entornos interactivos. - ✅ Usa subshells para aislar operaciones o redirigir bloques enteros.
- ✅ Siempre supervisa el uso de CPU y memoria en procesos de larga duración.
Resumen del tema
Conceptos clave #
- Gestión de Procesos en Background: ejecución en segundo plano (
&), control de trabajos (jobs,fg,bg) e identificación de PIDs ($!almacena el PID del último proceso hijo en background). - Señales de Sistema POSIX:
SIGINT(2 / Ctrl+C): interrupción interactiva.SIGTERM(15): solicitud estándar de terminación limpia.SIGKILL(9): terminación forzosa no interceptable.SIGHUP(1): desconexión de terminal o recarga de configuración.
- Captura de Señales con
trap: ejecución de funciones de limpieza al recibir señales específicas (trap 'limpiar' EXIT SIGINT SIGTERM). - Aislamiento en Subshells (
( ... )): entorno de ejecución secundario hijo que no propaga modificaciones de variables o cambios de directorio (cd) al shell padre. - Concurrencia Básica: paralelización con
&y sincronización con la instrucciónwait.
Qué debes recordar #
Usa & y wait para paralelizar tareas, y protege tus scripts interceptando SIGINT/SIGTERM con trap para liberar recursos y evitar procesos huérfanos.