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.
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