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!
- Omite temporalmente el desafío y continúa con los laboratorios guiados posteriores en la ruta de aprendizaje de Linux.
- 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.shen 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
echopara 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
nanopara crear y editar el archivo. Por ejemplo:nano log_manager.sh. - El comando
echose utiliza para mostrar una línea de texto. - Usa
chmod +x nombre_archivopara hacer que un script sea ejecutable. El+xañ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_DIRy 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
readpara capturar la entrada del usuario en una nueva variable llamadaBACKUP_FILENAME. - Añade un comando
echofinal 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_DIRestablecida en/home/labex/project/app_logs. - El script debe utilizar el comando
readpara 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
readpausa 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
ifpara comprobar si el directorio especificado por la variable$LOG_DIRexiste. - 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
echopara 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
ifbásica esif [ condición ]; then ... else ... fi. - La prueba
[ -d "$RUTA_DIRECTORIO" ]devuelve verdadero si$RUTA_DIRECTORIOexiste y es un directorio. exit 1es 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
backupsdentro de~/projectdonde 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 buclefor. - El bucle debe iterar sobre cada archivo que termine en
.logdentro del directorio$LOG_DIR. - Dentro del bucle, utiliza el comando
cppara 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/backupsdesde la línea de comandos. - El script debe utilizar un bucle
for. - El bucle debe iterar a través de los archivos en
$LOG_DIRque coincidan con el patrón*.log. - El comando
cpdebe utilizarse dentro del bucle para copiar archivos a~/project/backups. - Una sentencia
echodebe 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
forpara archivos puede escribirse comofor file in /ruta/a/*.log; do ... done. - La sintaxis del comando
cpescp <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!



