Curso de Shell Scripting
Un proceso es cualquier programa en ejecución. Bash puede lanzar, controlar, detener y terminar procesos, e incluso reaccionar a señales del sistema.
11.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
11.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.
11.3. Listar procesos
1ps 2ps aux # Lista más completa
Filtrar procesos por nombre:
1ps aux | grep "sleep"
11.4. Matar procesos
Terminar un proceso con kill (requiere PID):
1kill 1234
Forzar finalización:
1kill -9 1234
11.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.
11.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.
11.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.
11.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.
🏋️♂️ 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.
🏋️♂️ 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.
🏋️♂️ 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.
✅ 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.
- Loading...