Inicio > Cursos > Linux & Terminal > Scripts Robustos y Troubleshooting
Linux & TerminalAdministracion AvanzadaLección 12 de 12

Scripts Robustos y Troubleshooting

Los scripts de produccion necesitan manejar errores, registrar logs y fallar de forma predecible. Las directivas set controlan el comportamiento de Bash ante errores:

• set -e: el script se detiene si cualquier comando falla • set -u: error si usas una variable no definida • set -o pipefail: un pipe falla si cualquier comando en el falla (no solo el ultimo) • trap: ejecuta una funcion al recibir una senal o al salir del script

#!/bin/bash
set -euo pipefail

# TRAP: limpieza al salir (exito o error)
TMP_DIR=$(mktemp -d)
trap 'rm -rf "$TMP_DIR"; echo "Limpieza completada"' EXIT

# Funcion de logging con timestamps
LOG_FILE="/var/log/mi-script.log"
log() {
    local msg="[$(date +"%Y-%m-%d %H:%M:%S")] $1"
    echo "$msg" | tee -a "$LOG_FILE"
}

# Funcion de error
die() {
    log "FATAL: $1"
    exit 1
}

# Verificaciones previas
command -v docker &>/dev/null || die "Docker no esta instalado"
[ -f ".env" ] || die "Archivo .env no encontrado"

log "INFO: Iniciando deploy..."

# Comandos que pueden fallar
docker compose pull || die "No se pudo descargar imagenes"
docker compose up -d || die "No se pudo levantar servicios"

# Verificar que la app responde
for i in {1..30}; do
    if curl -sf http://localhost:3000/health > /dev/null; then
        log "OK: App respondiendo despues de ${i}s"
        exit 0
    fi
    sleep 1
done

die "App no respondio en 30 segundos"
# DEBUGGING de scripts

# Ejecutar en modo debug (muestra cada comando)
bash -x mi-script.sh

# Activar debug solo en una seccion
set -x
# ... comandos a debuggear ...
set +x

# TROUBLESHOOTING del sistema

# Que proceso usa un puerto?
sudo lsof -i :3000
# COMMAND  PID  USER  FD  TYPE  DEVICE  NODE  NAME
# node     891  user  23u IPv4  12345   TCP   *:3000 (LISTEN)

sudo ss -tlnp | grep 3000

# Que proceso usa un archivo?
lsof /var/log/app.log

# Trazar llamadas del sistema (diagnostico profundo)
strace -p 891 -e trace=network
# Muestra todas las llamadas de red del proceso 891

# Ver que archivos abre un comando
strace -e open,openat ls /tmp 2>&1 | head

# Dmesg: mensajes del kernel (hardware, drivers)
dmesg | tail -20
dmesg | grep -i error

# Journalctl: logs de systemd
journalctl -u nginx --since "1 hour ago"
journalctl -u mi-app -f  # follow en tiempo real
ConsejoEmpieza TODOS tus scripts con set -euo pipefail. Sin esto, los errores pasan desapercibidos y tu script puede continuar en un estado corrupto. Es la diferencia entre un script amateur y uno profesional.
← Bash Scripting Avanzado

Practica esta lección

Resuelve los ejercicios del curso de Linux & Terminal en la app, gratis y con corrección automática.

Empezar a practicar