DÍA 10: El Artesano de Scripts

LinuxBeginner
Practicar Ahora

Introducción

¡Bienvenido, aspirante a administrador de sistemas! Te acabas de unir a una dinámica empresa tecnológica como Ingeniero DevOps Junior. Tu colega senior está disfrutando de unas merecidas vacaciones y una tarea crítica acaba de llegar a tu escritorio. El servidor principal de aplicaciones está generando numerosos archivos de registro (logs) y 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 un par de comandos; se trata de construir una herramienta robusta y reutilizable. Comenzarás con un script sencillo e irás añadiendo progresivamente funcionalidades como variables, entrada de usuario, comprobación de errores y bucles. Al final de este desafío, habrás creado un script capaz de realizar copias de seguridad 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. Omite 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 asegurarte de que funciona 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 utilizar.
  • Añade un comando para imprimir el mensaje "Log Manager Initialized." en la pantalla.
  • Haz que el script sea ejecutable utilizando 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 utilizar el comando echo para mostrar el mensaje requerido.
  • El script debe tener permisos de ejecución (utiliza chmod +x log_manager.sh).

Ejemplos

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

Primero, verifica que el archivo del script existe:

ls ~/project/
log_manager.sh

Establece permisos de ejecución en el 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 debería 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 (hardcoded) no es muy flexible. Para hacer 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 una etiqueta para la ejecución de la copia de seguridad. 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 la entrada del usuario.
  • Utiliza 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 utilizar 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. La interacción debería verse así:

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

El script debería pausarse en el mensaje "Enter the backup filename:", esperando a que el usuario escriba un nombre y presione Enter. Después de que el usuario proporcione la entrada, muestra el mensaje de confirmación utilizando el valor ingresado. En este desafío, ese valor es una etiqueta de ejecución que se muestra en la salida, mientras que la acción real de copia de seguridad se implementará en el Paso 4 copiando los archivos .log a ~/project/backups.

Consejos

  • Para definir una variable, utiliza la sintaxis NOMBRE_VARIABLE="valor". No debe haber espacios alrededor del signo =.
  • Para utilizar el valor de una variable, anteponle un signo $, 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 los problemas. ¿Qué sucede si el directorio de logs que especificaste no existe? El script fallaría. Para hacer que tu script sea más robusto, necesitas añadir lógica condicional. Utilizará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 continuar como antes (solicitar el nombre del archivo, etc.).
  • Si el directorio no existe, el script debe imprimir un mensaje de error "Error: Log directory not found." y salir inmediatamente con un código de estado distinto de cero.

Requisitos

  • El script debe utilizar una sentencia if.
  • La condición debe comprobar la existencia de un directorio utilizando el operador de prueba -d.
  • Si el directorio no existe, el script debe usar echo para mostrar 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 debería 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 debería 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 la entrada del usuario ni proceder con ninguna operación de copia de seguridad.

Consejos

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

Recorrer operaciones de archivos con bucles

¡Ahora vamos al núcleo de la automatización! Necesitas procesar los archivos dentro del directorio de logs. Utilizarás un bucle for para iterar a través de todos los archivos que terminan en .log en el directorio app_logs. Para este desafío, simplemente los copiarás a un nuevo directorio de copias de seguridad. La entrada BACKUP_FILENAME sigue siendo una etiqueta de ejecución impresa en la salida, no un archivo de archivo creado por el script.

Tareas

  • Primero, crea un directorio llamado backups dentro de ~/project donde se copiarán los archivos de registro.
  • 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, utiliza el comando cp para copiar cada archivo de registro 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 utilizar 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 utilizarse 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 copia de seguridad, debería procesar todos los archivos de registro y mostrar una salida similar a:

./log_manager.sh
Log Manager Initialized.
Log directory found. Proceeding...
Enter the backup filename: daily_backup
Backing up logs to: daily_backup
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 debería iterar a través de cada archivo .log en el directorio, mostrando un mensaje "Copied" para cada uno. Los nombres de archivo exactos dependerán de los archivos de registro presentes en tu directorio app_logs.

Después de que el script termine, puedes verificar que los archivos se copiaron comprobando 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 puede escribirse 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 (gestionar archivos de registro) y lo resolviste con el poder de la automatización.

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

  • Crear y estructurar un script con un shebang.
  • Utilizar variables para hacer que tu script sea dinámico.
  • Capturar la entrada del usuario con read.
  • Implementar una comprobación de errores robusta con sentencias if.
  • Automatizar tareas repetitivas con bucles for.
  • Gestionar permisos de archivos y ejecutar tu script.

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 copia de seguridad. Este es un gran paso en tu viaje 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 manejar la responsabilidad 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