Introducción
¡Te damos la bienvenida, futuro administrador de sistemas! Acabas de incorporarte a una empresa tecnológica muy activa como ingeniero júnior de DevOps. Tu compañero sénior está disfrutando de unas merecidas vacaciones y acaba de llegar a tu mesa una tarea crítica. El servidor principal de aplicaciones está generando numerosos archivos de registro que consumen rápidamente el espacio del disco. Tu misión, si decides aceptarla, es convertirte en el artesano de los scripts.
Debes crear un script de shell automatizado para gestionar estos archivos de registro. No se trata simplemente de ejecutar unos cuantos comandos, sino de construir una herramienta sólida y reutilizable. Comenzarás con un script sencillo y añadirás progresivamente funciones como variables, entrada del usuario, comprobación de errores y bucles. Al finalizar este desafío, habrás creado un script capaz de hacer copias de seguridad y gestionar archivos, demostrando tu valor al equipo y resolviendo la situación.
¡Manos a la obra con los scripts!
- Omite temporalmente el desafío y continúa con los siguientes laboratorios guiados de la ruta de aprendizaje de Linux.
- Consulta tus dudas 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 comprobar que funciona correctamente. Este paso inicial confirma que la configuración es correcta y que estás preparado para crear 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) al principio del script. Esto indica al sistema qué intérprete debe utilizar. - Añade un comando que muestre en pantalla el mensaje "Log Manager Initialized.".
- Haz que el script sea ejecutable mediante 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 indicado. - El script debe tener permisos de ejecución (utiliza
chmod +x log_manager.sh).
Ejemplos
Después de crear el script y concederle permisos de ejecución, el proceso completo debería ser el siguiente:
Primero, comprueba que existe el archivo del script:
ls ~/project/
log_manager.sh
Concede 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 comprobar que el contenido del script es correcto:
cat ~/project/log_manager.sh
El archivo debería contener:
#!/bin/bash
echo "Log Manager Initialized."
Pistas
- Puedes utilizar 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
echose utiliza para mostrar una línea de texto. - Utiliza
chmod +x filenamepara hacer que un script sea ejecutable.+xañade permisos de ejecución para el propietario del archivo.
Añadir variables y entrada del usuario
Un script con valores escritos directamente en el código no es muy flexible. Para hacerlo más dinámico y reutilizable, ahora introducirás variables. Definirás una variable para el directorio de registros y pedirás al usuario una etiqueta para la ejecución de la copia de seguridad. Así, el script podrá adaptarse a distintas situaciones sin tener que modificar el código.
Tareas
- Modifica el script
log_manager.sh. - Define una variable llamada
LOG_DIRy asígnale la ruta/home/labex/project/app_logs. - Añade una línea que muestre "Enter the backup filename: " para solicitar una entrada al usuario.
- Utiliza el comando
readpara guardar la entrada del usuario en una nueva variable llamadaBACKUP_FILENAME. - Añade un comando
echofinal para confirmar la configuración y mostrar un mensaje como "Backing up logs to: [filename]", donde[filename]sea el valor introducido por el usuario.
Requisitos
- El script debe contener una variable
LOG_DIRcon el valor/home/labex/project/app_logs. - El script debe utilizar el comando
readpara obtener una 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
Al ejecutar el script modificado, este debería solicitar una entrada y mostrar el mensaje de confirmación. La interacción debería ser similar a la siguiente:
./log_manager.sh
Log Manager Initialized.
Enter the backup filename: daily_backup
Backing up logs to: daily_backup
El script debe detenerse en la solicitud "Enter the backup filename:", esperando a que el usuario escriba un nombre y pulse Enter. Después de recibir la entrada, mostrará el mensaje de confirmación utilizando el valor introducido. En este desafío, dicho valor es una etiqueta de ejecución que aparece en la salida; la copia real se implementa en el paso 4 copiando los archivos .log en ~/project/backups.
Pistas
- Para definir una variable, utiliza la sintaxis
VARIABLE_NAME="value". No debe haber espacios alrededor del signo=. - Para utilizar el valor de una variable, antepone un signo
$a su nombre, como en$MY_VARIABLE. - El comando
readpausa el script y espera a que el usuario escriba algo y pulse Enter.
Implementar lógica condicional
Un buen script se anticipa a los problemas. ¿Qué ocurre si no existe el directorio de registros especificado? El script fallaría. Para hacerlo más robusto, debes añadir lógica condicional. Utilizarás una instrucción if para comprobar que el directorio existe antes de intentar realizar cualquier operación.
Tareas
- Modifica el script
log_manager.sh. - Añade una instrucción
ifpara comprobar si existe el directorio indicado por la variable$LOG_DIR. - Si el directorio existe, el script debe continuar como antes (solicitar el nombre del archivo, etc.).
- Si el directorio no existe, el script debe mostrar el mensaje de error "Error: Log directory not found." y finalizar inmediatamente con un código de salida distinto de cero.
Requisitos
- El script debe utilizar una instrucción
if. - La condición debe comprobar la existencia de un directorio mediante el operador de prueba
-d. - Si el directorio no existe, el script debe mostrar con
echoel mensaje de error indicado. - Si el directorio no existe, el script debe finalizar mediante
exit 1.
Ejemplos
Cuando el directorio de registros 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 registros no existe, el script debería mostrar un error y finalizar:
./log_manager.sh
Log Manager Initialized.
Error: Log directory not found.
En este caso, el script finaliza inmediatamente después de mostrar el mensaje de error, sin solicitar la entrada del usuario ni continuar con operaciones de copia de seguridad.
Pistas
- La sintaxis de una instrucción
ifbásica esif [ condition ]; then ... else ... fi. - La prueba
[ -d "$DIRECTORY_PATH" ]devuelve verdadero si$DIRECTORY_PATHexiste y es un directorio. exit 1es una forma habitual de indicar que un script ha finalizado debido a un error.
Recorrer archivos para realizar operaciones
Ahora llega el núcleo de la automatización. Debes procesar los archivos del directorio de registros. Utilizarás un bucle for para recorrer todos los archivos que terminen en .log dentro del directorio app_logs. En este desafío, simplemente los copiarás a un nuevo directorio de copias de seguridad. La entrada BACKUP_FILENAME seguirá siendo una etiqueta de ejecución que se muestra en la salida, no un archivo comprimido creado por el script.
Tareas
- Primero, crea un directorio llamado
backupsdentro de~/projectdonde se copiarán los archivos de registro. - Modifica el script
log_manager.sh. - Dentro del bloque
if(donde se confirma que el directorio existe), añade un buclefor. - El bucle debe recorrer todos los archivos que terminen 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, muestra 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 recorrer los archivos de
$LOG_DIRque coincidan con el patrón*.log. - Debe utilizarse el comando
cpdentro del bucle para copiar los archivos a~/project/backups. - Una instrucción
echodebe informar del nombre de cada archivo a medida que se copia.
Ejemplos
Después de completar este paso, al ejecutar el script con un nombre de copia de seguridad, debería procesar todos los archivos de registro y mostrar una salida similar a esta:
./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 debe recorrer cada archivo .log del directorio y mostrar un mensaje "Copied" por cada archivo. Los nombres exactos dependerán de los archivos de registro presentes en el directorio app_logs.
Cuando el script termine, puedes comprobar que los archivos se copiaron correctamente consultando el directorio backups:
ls ~/project/backups/
access.log debug.log error.log
Pistas
- Puedes crear un directorio mediante el comando
mkdir. - Un bucle
forpara archivos puede escribirse comofor file in /path/to/*.log; do ... done. - La sintaxis del comando
cpescp <source> <destination>. - La variable del bucle (por ejemplo,
file) contendrá la ruta completa del archivo en cada iteración.
Resumen
¡Enhorabuena, artesano de los scripts! Has creado desde cero un script de shell completo y funcional. Te enfrentaste a un problema del mundo real —la gestión de archivos de registro— y lo resolviste mediante la automatización.
En este desafío has aprendido varios conceptos fundamentales de los scripts de shell:
- Crear y estructurar un script mediante una línea shebang.
- Utilizar variables para hacer que el script sea dinámico.
- Capturar la entrada del usuario con
read. - Implementar una comprobación sólida de errores mediante instrucciones
if. - Automatizar tareas repetitivas con bucles
for. - Gestionar permisos de archivos y ejecutar el script.
Ahora tu script puede comprobar automáticamente la existencia de directorios de registros, procesar todos los archivos de registro y copiarlos a una ubicación de copia de seguridad. Este es un gran paso en tu trayectoria como ingeniero de DevOps o administrador de sistemas. Las habilidades que has practicado aquí son la base para crear scripts de automatización mucho más complejos, capaces de gestionar servidores, desplegar aplicaciones y procesar datos. Has demostrado que puedes asumir responsabilidades y entregar una solución funcional. ¡Excelente trabajo!



