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!
- Salta 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 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.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 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
echopara 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
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 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_DIRy 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
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 usar 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. 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
readpausa 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
ifpara comprobar si el directorio especificado por la variable$LOG_DIRexiste. - 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
echocon 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
ifbásica esif [ condicion ]; then ... else ... fi. - La prueba
[ -d "$RUTA_DIRECTORIO" ]devuelve verdadero si$RUTA_DIRECTORIOexiste y es un directorio. exit 1es 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
backupsdentro de~/projectdonde 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 buclefor. - El bucle debe iterar sobre cada archivo que termine en
.logdentro del directorio$LOG_DIR. - Dentro del bucle, usa el comando
cppara 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/backupsdesde la línea de comandos. - El script debe usar 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 usarse 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 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
forpara archivos se puede escribir 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 —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!



