Gestión de errores y registros en scripts
Implemente una gestión sólida de errores, redirija la salida de los scripts y genere registros útiles para supervisar su ejecución y solucionar problemas.
Gestión de errores y registros en scripts es una lección gratuita de Linux Server Deployment & SSH Mastery en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Linux Server Deployment & SSH Mastery, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Linux Server Deployment & SSH Mastery incluye 4 lecciones en total.
Haga que sus scripts sean fiables
Imagine que su script se ejecuta en un servidor y realiza una tarea importante. ¿Qué ocurre si algo sale mal?
- ¿Falla silenciosamente?
- ¿Deja un desastre tras de sí?
- ¿Puede saber cuándo y por qué ha fallado?
Los scripts robustos gestionan los errores correctamente y proporcionan registros claros. ¡En esta lección aprenderá a hacerlo!
Comprender los códigos de salida
Todos los comandos y scripts de Linux devuelven un código de salida (o estado de salida) cuando terminan. Este número indica si la operación se realizó correctamente o falló.
0: Indica que la operación se realizó correctamente. Todo salió bien.1-255: Indica un fallo. Un número específico puede señalar el tipo de error.
Veámoslo en acción:
#!/bin/bash
# This script demonstrates exit codes
echo "Attempting a successful command..."
ls /tmp
echo "Exit code for 'ls /tmp': $?"
echo
echo "Attempting a failing command..."
ls /nonexistent_directory
echo "Exit code for 'ls /nonexistent_directory': $?"Comprobar el estado de un comando
Después de ejecutar cualquier comando, puede comprobar su código de salida mediante la variable especial $?. Esto resulta muy útil para tomar decisiones en su script.
Puede usar una instrucción if para reaccionar ante el éxito o el fallo:
#!/bin/bash
# Check if a file exists before trying to read it
FILENAME="test_file.txt"
touch $FILENAME # Create it for success case
if [ -f "$FILENAME" ]; then
echo "File '$FILENAME' exists. Processing..."
# ... do something with the file ...
rm $FILENAME # Clean up
else
echo "Error: File '$FILENAME' not found!"
exit 1
fi
echo "Script finished."`set -e`: salir al producirse un error
En los scripts sencillos, comprobar manualmente $? en todas partes puede resultar tedioso. El comando set -e cambia el comportamiento de su script:
- Si algún comando termina con un estado distinto de cero (falla), el script finaliza inmediatamente.
- Esto evita que el script continúe con datos potencialmente dañados o en un estado no válido.
Pruebe a ejecutar este script. ¿Qué ocurre si falla el comando cp?
#!/bin/bash
set -e
echo "Starting important operations..."
mkdir my_temp_dir
cp /nonexistent_source my_temp_dir/target # This will fail
echo "This line will not be reached if cp fails."
rmdir my_temp_dir
echo "Script finished successfully."`trap` para la limpieza
A veces, aunque un script falle, debe realizar tareas de limpieza, como eliminar archivos temporales. El comando trap permite capturar señales (como una salida o un error) y ejecutar un comando.
EXIT: Se ejecuta cuando el script termina, independientemente de si lo hace correctamente o con errores.ERR: Se ejecuta cuando un comando termina con un estado distinto de cero (siset -eestá activo).
En este caso, nos aseguramos de que siempre se elimine un directorio temporal:
#!/bin/bash
TEMP_DIR="/tmp/my_script_temp_$(date +%s)"
function cleanup {
echo "Cleaning up temporary directory: $TEMP_DIR"
rm -rf "$TEMP_DIR"
}
trap cleanup EXIT
mkdir "$TEMP_DIR"
echo "Working in $TEMP_DIR..."
# Simulate some work, maybe it fails
# cp /nonexistent_file "$TEMP_DIR/" # Uncomment to test failure
echo "Script completed."Redirigir la salida
Cuando se ejecuta su script, normalmente muestra mensajes. Estos pertenecen principalmente a dos tipos:
- Salida estándar (stdout): Mensajes normales (descriptor de archivo 1).
- Error estándar (stderr): Mensajes de error (descriptor de archivo 2).
Puede redirigir estos flujos a archivos en lugar de mostrarlos en pantalla:
command > file: Redirige stdout afile.command 2> file: Redirige stderr afile.
Guardemos por separado los mensajes de éxito y de error.
#!/bin/bash
# Redirect stdout to success.log and stderr to error.log
echo "This is a success message." > success.log
ls /nonexistent_path 2> error.log
echo "Check success.log and error.log files."
# To view them after running:
# cat success.log
# cat error.logToda la salida en un solo archivo
A menudo resulta útil tener tanto la salida estándar como el error estándar en un único archivo de registro para facilitar su revisión. Hay un par de formas de hacerlo:
command > file 2>&1: Redirige stdout afiley, después, redirige stderr al destino de stdout (el archivo).command &> file: Una sintaxis más breve y moderna para hacer lo mismo.
Esto resulta ideal para crear un registro completo de la ejecución de su script.
#!/bin/bash
# Redirect both stdout and stderr to a single log file
LOG_FILE="combined_script.log"
echo "Starting script..." &> "$LOG_FILE"
echo "This message goes to stdout." &>> "$LOG_FILE"
ls /nonexistent_dir 2>&1 | tee -a "$LOG_FILE"
echo "Script finished." &>> "$LOG_FILE"
echo "Check the '$LOG_FILE' file for all output."Añadir marcas de tiempo a los registros
Al depurar, es fundamental saber cuándo ocurrió un evento. Añadir marcas de tiempo a los mensajes de registro hace que sean mucho más útiles.
Puede anteponer la fecha y hora actuales a cada entrada del registro mediante el comando date. Esto ayuda a rastrear los eventos en orden cronológico.
#!/bin/bash
LOG_FILE="timestamped_script.log"
function log_message {
echo "$(date +%Y-%m-%d_%H:%M:%S) - $1" &>> "$LOG_FILE"
}
log_message "Script started."
sleep 1
log_message "Performing task A..."
# Simulate an error
ls /no_such_place || log_message "Error: Command failed."
sleep 1
log_message "Script finished."
echo "Check '$LOG_FILE' for timestamped entries."Enviar a los registros del sistema con `logger`
Para eventos importantes, puede que quiera enviar los mensajes directamente al sistema de registro del sistema (syslog). El comando logger hace exactamente eso.
- Los registros del sistema suelen gestionarse con herramientas como
journalctl(en sistemas systemd). - Esto centraliza los mensajes importantes de su script junto con otros eventos del sistema.
- Resulta útil para errores críticos o registros de auditoría.
Los mensajes enviados con logger pueden consultarse mediante journalctl -f o tail -f /var/log/syslog (según el sistema).
#!/bin/bash
# Send a message to system logs
SCRIPT_NAME="MyBackupScript"
logger -t "$SCRIPT_NAME" "Starting daily backup operation."
# Simulate a task
sleep 2
if [ $(($RANDOM % 2)) -eq 0 ]; then
logger -t "$SCRIPT_NAME" -p user.info "Backup successful."
else
logger -t "$SCRIPT_NAME" -p user.err "Backup failed: Disk full."
fi
echo "Messages sent to system logs. Check with 'journalctl -t $SCRIPT_NAME'."Comprobación de gestión de errores
Ha escrito un script de Bash para procesar algunos archivos. Quiere que el script termine inmediatamente si falla cualquier comando que contenga y también asegurarse de que se limpie un directorio temporal independientemente de cómo termine el script.
¿Qué dos comandos de Bash usaría principalmente para conseguirlo?
Repaso y próximos pasos
¡Ha aprendido a hacer que sus scripts de Bash sean más robustos y fáciles de depurar!
- Códigos de salida: Comprender el éxito o el fallo de los comandos.
set -e: Salir automáticamente cuando se produce un error.trap: Realizar acciones de limpieza al terminar el script.- Redirección de la salida: Controlar el destino de stdout y stderr.
- Marcas de tiempo: Añadir contexto a los registros.
logger: Integrarse con el registro de todo el sistema.
Al aplicar estas técnicas, sus tareas automatizadas serán más fiables y fáciles de gestionar. ¡Siga practicando para crear una automatización realmente resistente!
Preguntas frecuentes
¿La lección «Gestión de errores y registros en scripts» es gratis?
Sí — el texto completo de «Gestión de errores y registros en scripts» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Linux Server Deployment & SSH Mastery, actualiza a CoddyKit PRO. El curso de Linux Server Deployment & SSH Mastery incluye 4 lecciones en total.
¿Qué aprenderé en «Gestión de errores y registros en scripts»?
Implemente una gestión sólida de errores, redirija la salida de los scripts y genere registros útiles para supervisar su ejecución y solucionar problemas. Practicas Linux Server Deployment & SSH Mastery con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar Linux Server Deployment & SSH Mastery?
No se requiere experiencia previa. Linux Server Deployment & SSH Mastery en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Gestión de errores y registros en scripts»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de Linux Server Deployment & SSH Mastery?
Sí. Cada lección de Linux Server Deployment & SSH Mastery incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Introducción a los scripts de Bash
- Automatización de tareas del servidor
- Gestión de errores y registros en scripts
- Funciones, argumentos y scripts reutilizables