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ñalNúmeroUso principal
SIGINT2Interrumpir (Ctrl+C)
SIGTERM15Finalización controlada
SIGKILL9Finalización forzada
SIGHUP1Reinicio de configuración
EXITEvento 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:

  1. Ejecute un proceso en segundo plano que escriba cada 2 segundos en un archivo log.txt.
  2. Use trap para capturar SIGINT (Ctrl+C) y detener el proceso de forma controlada.
  3. Al finalizar, muestre cuántas líneas se escribieron en log.txt.

🏋️‍♂️ Ejercicio práctico 2

Crea un script procesos_activos.sh que:

  1. Muestre los 5 procesos que más memoria consumen (ps aux --sort=-%mem).
  2. Pregunte al usuario si quiere terminar alguno indicando su PID.
  3. Si el usuario confirma, envíe una señal SIGTERM al proceso elegido.

🏋️‍♂️ Ejercicio práctico 3

Crea un script tareas_paralelas.sh que:

  1. Use tres subshells para realizar tareas simuladas (por ejemplo, sleep 2 y luego imprimir un mensaje).
  2. Cada tarea debe ejecutarse en paralelo.
  3. Al final, mostrar el tiempo total de ejecución.

👉 Pista: Usa & para paralelizar y wait para esperar a que terminen.


✅ Buenas prácticas

  1. ✅ Usa trap para limpiar recursos temporales al salir.
  2. ✅ Evita kill -9 a menos que sea estrictamente necesario.
  3. ✅ Usa jobs, fg, bg para depurar en entornos interactivos.
  4. ✅ Usa subshells para aislar operaciones o redirigir bloques enteros.
  5. ✅ Siempre supervisa el uso de CPU y memoria en procesos de larga duración.
  • Loading...