DÍA 10: El Artesano de Scripts

LinuxBeginner
Practicar Ahora

Introducción

¡Bienvenido, futuro administrador de sistemas! Te acabas de incorporar a una dinámica empresa tecnológica como Ingeniero DevOps Junior. Tu colega senior se ha tomado unas merecidas vacaciones y una tarea crítica acaba de aterrizar en tu escritorio. El servidor de la aplicación principal está generando numerosos archivos de registro (logs) que están consumiendo rápidamente el espacio en disco. Tu misión, si decides aceptarla, es convertirte en El Artesano de Scripts.

Necesitas crear un script de shell automatizado para gestionar estos archivos de registro. No se trata solo de ejecutar unos cuantos comandos; se trata de construir una herramienta robusta y reutilizable. Comenzarás con un script sencillo y añadirás progresivamente funciones como variables, entrada de usuario, comprobación de errores y bucles. Al final de este desafío, habrás creado un script capaz de respaldar y gestionar archivos, ¡demostrando tu valor al equipo y salvando el día!

¡Manos a la obra con el scripting!

Aviso Importante
Los próximos desafíos pueden exceder el alcance del curso Quick Start with Linux.
Si encuentras dificultades durante el desafío:
  1. Salta temporalmente el desafío y continúa con los laboratorios guiados posteriores en la ruta de aprendizaje de Linux.
  2. Consulta con Labby o revisa la solución.

Escribir un Script de Shell Sencillo

Tu primera tarea es sentar las bases. Todo gran script comienza con una sola línea. Debes crear el archivo del script y añadir un comando básico para asegurar que funcione correctamente. Este paso inicial confirma que tu configuración es correcta y que estás listo para construir una lógica más compleja.

Tareas

  • Crea un nuevo archivo de script de shell llamado log_manager.sh en el directorio ~/project.
  • Añade una línea "shebang" (#!/bin/bash) en la parte superior del script. Esto le indica al sistema qué intérprete debe usar.
  • Añade un comando para imprimir el mensaje "Log Manager Initialized." en la pantalla.
  • Convierte el script en ejecutable usando el comando chmod +x.

Requisitos

  • El script debe llamarse log_manager.sh.
  • El script debe estar ubicado en el directorio ~/project.
  • La primera línea debe ser #!/bin/bash.
  • El script debe usar el comando echo para mostrar el mensaje requerido.
  • El script debe tener permisos de ejecución (usa chmod +x log_manager.sh).

Ejemplos

Después de crear y dar permisos de ejecución al script, el proceso completo debería verse así:

Primero, verifica que el archivo del script existe:

ls ~/project/
log_manager.sh

Asigna permisos de ejecución al script:

chmod +x ~/project/log_manager.sh

Ahora ejecuta el script:

./log_manager.sh

El script debería mostrar:

Log Manager Initialized.

También puedes verificar que el contenido del script sea correcto:

cat ~/project/log_manager.sh

El archivo debe contener:

#!/bin/bash

echo "Log Manager Initialized."

Consejos

  • Puedes usar un editor de texto de línea de comandos como nano para crear y editar el archivo. Por ejemplo: nano log_manager.sh.
  • El comando echo se utiliza para mostrar una línea de texto.
  • Usa chmod +x nombre_archivo para hacer que un script sea ejecutable. El +x añade permisos de ejecución para el propietario del archivo.

Añadir Variables y Entrada de Usuario

Un script con valores fijos no es muy flexible. Para que tu script sea más dinámico y reutilizable, ahora introducirás variables. Definirás una variable para el directorio de logs y solicitarás al usuario un nombre para el archivo de respaldo. Esto hace que el script sea adaptable a diferentes situaciones sin necesidad de cambiar el código.

Tareas

  • Modifica tu script log_manager.sh.
  • Define una variable llamada LOG_DIR y asígnale la ruta /home/labex/project/app_logs.
  • Añade una línea para imprimir "Enter the backup filename: " para solicitar información al usuario.
  • Usa el comando read para capturar la entrada del usuario en una nueva variable llamada BACKUP_FILENAME.
  • Añade un comando echo final para confirmar la configuración, mostrando un mensaje como "Backing up logs to: [filename]", donde [filename] es el valor introducido por el usuario.

Requisitos

  • El script debe contener una variable LOG_DIR establecida en /home/labex/project/app_logs.
  • El script debe usar el comando read para obtener la entrada del usuario.
  • La entrada del usuario debe almacenarse en una variable llamada BACKUP_FILENAME.
  • La salida final debe utilizar la variable $BACKUP_FILENAME.

Ejemplos

Cuando ejecutes el script modificado, debería solicitar la entrada del usuario y mostrar el mensaje de confirmación. Así debería ser la interacción:

./log_manager.sh
Log Manager Initialized.
Enter the backup filename: my_backup_2024.tar.gz
Backing up logs to: my_backup_2024.tar.gz

El script se detendrá en el aviso "Enter the backup filename:", esperando a que el usuario escriba un nombre de archivo y presione Enter. Después de que el usuario proporcione la entrada, mostrará el mensaje de confirmación usando el nombre de archivo ingresado.

Consejos

  • Para definir una variable, usa la sintaxis NOMBRE_VARIABLE="valor". No debe haber espacios alrededor del signo =.
  • Para usar el valor de una variable, antepón el signo $ a su nombre, como $MI_VARIABLE.
  • El comando read pausa el script y espera a que el usuario escriba algo y presione Enter.

Implementar Lógica Condicional

Un buen script anticipa problemas. ¿Qué pasaría si el directorio de logs que especificaste no existe? El script fallaría. Para que tu script sea más robusto, necesitas añadir lógica condicional. Usarás una sentencia if para comprobar si el directorio de logs existe antes de intentar cualquier operación.

Tareas

  • Modifica tu script log_manager.sh.
  • Añade una sentencia if para comprobar si el directorio especificado por la variable $LOG_DIR existe.
  • Si el directorio existe, el script debe proceder como antes (solicitar nombre de archivo, etc.).
  • Si el directorio no existe, el script debe imprimir un mensaje de error "Error: Log directory not found." y finalizar inmediatamente con un código de estado distinto de cero.

Requisitos

  • El script debe usar una sentencia if.
  • La condición debe comprobar la existencia de un directorio usando el operador de prueba -d.
  • Si el directorio no existe, el script debe ejecutar echo con el mensaje de error especificado.
  • Si el directorio no existe, el script debe terminar usando exit 1.

Ejemplos

Cuando el directorio de logs existe, el script debe ejecutarse normalmente:

./log_manager.sh
Log Manager Initialized.
Log directory found. Proceeding...
Enter the backup filename: test_backup.tar.gz
Backing up logs to: test_backup.tar.gz

Si el directorio de logs no existe, el script debe mostrar un error y salir:

./log_manager.sh
Log Manager Initialized.
Error: Log directory not found.

En este caso, el script termina inmediatamente después de mostrar el mensaje de error, sin solicitar entrada al usuario ni proceder con ninguna operación de respaldo.

Consejos

  • La sintaxis para una sentencia if básica es if [ condicion ]; then ... else ... fi.
  • La prueba [ -d "$RUTA_DIRECTORIO" ] devuelve verdadero si $RUTA_DIRECTORIO existe y es un directorio.
  • exit 1 es la forma estándar de señalar que un script ha terminado con un error.

Bucles para Operaciones de Archivos

¡Llegamos al núcleo de la automatización! Necesitas procesar los archivos dentro del directorio de logs. Usarás un bucle for para iterar a través de todos los archivos que terminen en .log en el directorio app_logs. Para este desafío, simplemente los copiarás a un nuevo directorio de respaldo.

Tareas

  • Primero, crea un directorio llamado backups dentro de ~/project donde se copiarán los archivos de log.
  • Modifica tu script log_manager.sh.
  • Dentro del bloque if (donde se confirma que el directorio existe), añade un bucle for.
  • El bucle debe iterar sobre cada archivo que termine en .log dentro del directorio $LOG_DIR.
  • Dentro del bucle, usa el comando cp para copiar cada archivo de log al directorio ~/project/backups.
  • Por cada archivo copiado, imprime un mensaje como "Copied [filename]".

Requisitos

  • Primero debes crear el directorio ~/project/backups desde la línea de comandos.
  • El script debe usar un bucle for.
  • El bucle debe iterar a través de los archivos en $LOG_DIR que coincidan con el patrón *.log.
  • El comando cp debe usarse dentro del bucle para copiar archivos a ~/project/backups.
  • Una sentencia echo debe informar el nombre de cada archivo a medida que se copia.

Ejemplos

Después de completar este paso, cuando ejecutes el script con un nombre de archivo de respaldo, debería procesar todos los archivos de log y mostrar una salida similar a:

./log_manager.sh
Log Manager Initialized.
Log directory found. Proceeding...
Enter the backup filename: full_backup.tar.gz
Backing up logs to: full_backup.tar.gz
Copied /home/labex/project/app_logs/access.log
Copied /home/labex/project/app_logs/debug.log
Copied /home/labex/project/app_logs/error.log
Backup complete.

El script debe iterar por cada archivo .log en el directorio, mostrando un mensaje "Copied" para cada uno. Los nombres de archivo exactos dependerán de los archivos de log presentes en tu directorio app_logs.

Una vez finalizado el script, puedes verificar que los archivos se copiaron revisando el directorio backups:

ls ~/project/backups/
access.log  debug.log  error.log

Consejos

  • Puedes crear un directorio usando el comando mkdir.
  • Un bucle for para archivos se puede escribir como for file in /ruta/a/*.log; do ... done.
  • La sintaxis del comando cp es cp <origen> <destino>.
  • La variable del bucle (por ejemplo, file) contendrá la ruta completa al archivo en cada iteración.

Resumen

¡Felicidades, Artesano de Scripts! Has construido con éxito un script de shell completo y funcional desde cero. Te enfrentaste a un problema del mundo real —la gestión de archivos de log— y lo resolviste con el poder de la automatización.

En este desafío, has dominado varios conceptos fundamentales del scripting en shell:

  • Creación y estructuración de un script con shebang.
  • Uso de variables para hacer tu script dinámico.
  • Captura de entrada de usuario con read.
  • Implementación de comprobación de errores robusta con sentencias if.
  • Automatización de tareas repetitivas con bucles for.
  • Gestión de permisos de archivos y ejecución de scripts.

Tu script ahora puede comprobar automáticamente la existencia de directorios de logs, procesar todos los archivos de registro y copiarlos a una ubicación de respaldo. Este es un gran paso en tu camino como ingeniero DevOps o administrador de sistemas. Las habilidades que has practicado aquí son la base para escribir scripts de automatización mucho más complejos que pueden gestionar servidores, desplegar aplicaciones y procesar datos. Has demostrado que puedes asumir responsabilidades y entregar una solución funcional. ¡Bien hecho!

✨ Revisar Solución y Practicar✨ Revisar Solución y Practicar✨ Revisar Solución y Practicar✨ Revisar Solución y Practicar