Saltar a contenido

📚 Módulo 7: Construyendo un asistente experto

Duración estimada: según tu ritmo y experiencia.

Objetivo: Desarrollar un proyecto completo (backups o monitoreo), optimizar scripts para eficiencia, y manejar errores avanzados, consolidando tus habilidades técnicas. 🎯

Prerrequisitos: Haber completado los Módulos 1, 2, 3, 4, 5 y 6, acceso a un sistema Linux, macOS o WSL con una terminal y un editor de texto (nano, vim o VS Code), y, si posible, una máquina remota con ssh.

Nota: El tiempo varía según tu nivel y dedicación; dedica tiempo a personalizar tu proyecto según tus necesidades.


📖 Contenidos del Módulo

7.1. Proyecto: Sistema de backups 🏗️

Teoría:

Un sistema de backups copia archivos automáticamente. Usa funciones, cron, y validación para robustez. Técnicamente, esto protege datos críticos.

Práctica:

  1. Crea un script base backup.sh:
    nano backup.sh
    #!/bin/bash
    # Script de respaldo diario
    backup_dir="/tmp/backups"
    mkdir -p $backup_dir
    cp *.txt $backup_dir/
    
  2. Añade una función y fecha:
    nano backup.sh
    backup() {
        fecha=$(date +%F)
        cp $1 $backup_dir/backup_$fecha.txt
    }
    for file in *.txt
    do
        backup "$file"
    done
    chmod +x backup.sh
    ./backup.sh
    ls $backup_dir
    
  3. Valida existencia de archivos:
    nano backup.sh
    if [ -f "$file" ]
    then
        backup "$file"
    else
        echo "Archivo $file no encontrado" >&2
    fi
    ./backup.sh
    
  4. Programa con cron:
    crontab -e
    # Añade: 0 0 * * * /ruta/a/backup.sh >> /tmp/backup.log 2>&1
    cat /tmp/backup.log
    
  5. Limpia backups antiguos:
    nano backup.sh
    find $backup_dir -type f -mtime +7 -delete
    ./backup.sh
    ls $backup_dir
    

Dato curioso

Los backups evitan desastres; empresas los usan diariamente. 😄

7.2. Proyecto: Sistema de monitoreo 🚀

Teoría:

Un sistema de monitoreo vigila recursos (CPU, memoria). Usa ps, top, y bucles para alertas. Técnicamente, esto optimiza el rendimiento.

Práctica:

  1. Crea un script base monitor.sh:
    nano monitor.sh
    #!/bin/bash
    echo "Monitoreo: $(date)" > /tmp/monitor.log
    ps -u $USER >> /tmp/monitor.log
    
  2. Añade una función de alerta:
    nano monitor.sh
    alerta() {
        uso=$(top -bn1 | grep "Cpu(s)" | awk '{print $2}')
        if [ $(echo "$uso > 50" | bc -l) -eq 1 ]
        then
            echo "Alerta: CPU alta $uso%" >> /tmp/monitor.log
        fi
    }
    alerta
    chmod +x monitor.sh
    ./monitor.sh
    cat /tmp/monitor.log
    
  3. Usa un bucle while:
    nano monitor.sh
    while true
    do
        alerta
        sleep 60
    done
    # Para detener: Ctrl+C
    
  4. Programa con cron:
    crontab -e
    # Añade: */5 * * * * /ruta/a/monitor.sh >> /tmp/monitor.log 2>&1
    cat /tmp/monitor.log
    
  5. Añade monitoreo remoto (opcional):
    nano monitor.sh
    ssh usuario@192.168.1.100 "top -bn1" > /tmp/remoto.log
    ./monitor.sh
    cat /tmp/remoto.log
    

Consejo

Ajusta el intervalo de sleep según tus necesidades. 💡

7.3. Optimización: Eficiencia en scripts 🛡️

Teoría:

Optimizar reduce tiempo y recursos. Usa variables locales (local), evita bucles innecesarios. Técnicamente, esto mejora el rendimiento.

Práctica:

  1. Crea un script ineficiente:
    nano lento.sh
    #!/bin/bash
    for i in {1..1000}
    do
        echo $i
    done > salida.txt
    chmod +x lento.sh
    time ./lento.sh
    
  2. Optimiza con redirección externa:
    nano rapido.sh
    #!/bin/bash
    for i in {1..1000}
    do
        echo $i
    done > salida.txt
    time ./rapido.sh
    
  3. Usa variables locales:
    nano rapido.sh
    optimiza() {
        local count=0
        for i in {1..1000}
        do
            ((count++))
        done
        echo $count
    }
    optimiza
    ./rapido.sh
    
  4. Evita comandos repetidos:
    nano rapido.sh
    fecha=$(date)
    for i in {1..5}
    do
        echo "Iteración $i - $fecha"
    done
    ./rapido.sh
    
  5. Compara tiempos:
    time ./lento.sh
    time ./rapido.sh
    

Advertencia

Evita cat dentro de bucles; usa redirecciones directas. 🛑

7.4. Manejo de errores avanzado: Robustez 🖌️

Teoría:

Manejar errores usa trap para capturar señales y || para fallbacks. Ejemplo: trap 'echo Error' ERR. Técnicamente, esto asegura scripts fiables.

Práctica:

  1. Crea un script con error:
    nano error.sh
    #!/bin/bash
    ls /ruta/falsa
    echo "Continúa"
    chmod +x error.sh
    ./error.sh
    
  2. Usa trap para capturar:
    nano error.sh
    trap 'echo "Error detectado" >&2' ERR
    ls /ruta/falsa
    echo "Continúa"
    ./error.sh
    
  3. Añade un fallback con ||:
    nano error.sh
    ls /ruta/falsa || echo "Fallo ignorado" >&2
    echo "Continúa"
    ./error.sh
    
  4. Combina en un script:
    nano seguro.sh
    #!/bin/bash
    trap 'echo "Fallo en línea $LINENO" >&2' ERR
    cp noexiste.txt /tmp/ || echo "Copia falló" >&2
    chmod +x seguro.sh
    ./seguro.sh
    
  5. Prueba con señal manual:
    trap 'echo "Interrumpido" >&2' INT
    while true
    do
        echo "Ejecutando"
        sleep 1
    done
    # Presiona Ctrl+C
    

Consejo

Usa LINENO para rastrear errores en scripts largos. 💡

7.5. Proyecto final: Tu asistente personalizado 🚀

Teoría:

Integra todo en un proyecto (backup o monitoreo). Añade documentación y optimización. Técnicamente, esto demuestra maestría.

Práctica:

  1. Elige backup o monitoreo:
    # Usa backup.sh o monitor.sh como base
    nano asistente.sh
    
  2. Añade funciones y optimización:
    #!/bin/bash
    backup() {
        local dir="/tmp/backups"
        mkdir -p $dir
        cp $1 $dir/backup_$(date +%F).txt
    }
    for file in *.txt
    do
        [ -f "$file" ] && backup "$file"
    done
    
  3. Incluye manejo de errores:
    trap 'echo "Error en línea $LINENO" >&2' ERR
    [ -d "$dir" ] || { echo "Directorio no creado" >&2; exit 1; }
    
  4. Programa con cron:
    crontab -e
    # Añade: 0 0 * * * /ruta/a/asistente.sh >> /tmp/asistente.log 2>&1
    cat /tmp/asistente.log
    
  5. Documenta y prueba:
    nano asistente.sh
    # Asistente de respaldo diario
    # Autor: [Tu nombre]
    # Descripción: Copia archivos .txt a /tmp/backups
    chmod +x asistente.sh
    ./asistente.sh
    ls /tmp/backups
    

Consejo

Personaliza el proyecto según tu entorno (ej. rutas, alertas). 💡


🛠️ Ejercicios prácticos

  1. Backup:
    • Añade validación a backup.sh para archivos específicos.
  2. Monitoreo:
    • Modifica monitor.sh para alertar por memoria alta.
  3. Optimización:
    • Optimiza un script eliminando un bucle innecesario.
  4. Errores:
    • Usa trap para capturar un error en un script.
  5. Desafío:
    • Crea un asistente que combine backup remoto con monitoreo local.

📝 Evaluación

Cuestionario corto (5 preguntas):

  1. ¿Qué hace un sistema de backups en Bash?
  2. ¿Cómo optimizas un script en Bash?
  3. ¿Para qué sirve trap en manejo de errores?
  4. ¿Qué mejora la documentación en un proyecto?
  5. ¿Cómo integras cron en un script completo?

Tarea práctica:

  • Crea un script asistente_final.sh que:
    • Implemente un sistema de backups o monitoreo.
    • Use funciones y optimización.
    • Maneje errores con trap.
    • Programe con cron y guarde logs.
  • Entrega: Script, log, y una nota con las decisiones tomadas.

🎉 Recursos adicionales

Tip

Revisa tus logs para perfeccionar tu asistente. 💡


🚀 Siguientes pasos

¡Felicidades por completar el Módulo 7! En el Módulo 8, explorarás maestría en Bash y más allá. ¡Sigue brillando! ✍️