Bash: Control de errores y debug

Recientemente hablamos acerca de las diferencias de usar /bin/bash o /usr/bin/env bash. No suele ser algo muy habitual, pero puede resultar de gran ayuda.
Hoy vamos a ver otro de esos pequeños trucos de bash, pero que puede resultar de gran ayuda. Estamos hablando del control de errores y de habilitar el modo debug.
Como suele ser habitual es los script en bash, tras inicializar el entorno, se suele poner el comando 'set -e', abreviatura de 'set -o errexit'.
#!/usr/bin/env bash
set -e

# Código bash a ejecutar...
En caso de que durante la ejecución del script aparezca algún error, inmediatamente detendrá la ejecución del script.

El método antes comentando suele ser útil para scripts de producción, donde se presupone que no van a existir errores y por lo tanto no es necesario saber exactamente lo que pasa. Sin embargo, cuando estamos escribiendo código, sí puede resultar muy útil tener habilitado el modo debug. Para eso, 'set -x' es la solución.
#!/usr/bin/env bash
set -x

# Código bash a ejecutar...

Nota: 'set -x' en el script es lo mismo que 'bash -x tu_script'.
Leer más

MySQL, rotado de slow logs

Hace un tiempo publicamos una entrada acerca de cómo activar el log de Slow Query's para MySQL. Esta práctica suele ser bastante habitual y recomendada. Si una query tarda mucho en ejecutarse puede comprometer todo el rendimiento del sistema. Así que mejor saber cual es, para poder solucionarla (si es posible).
El detalle que nos trae a cuenta es que este log, al final es un fichero de texto con muchas entradas, pero que crece de forma indefinida y cada vez ocupa más o más espacio. Para evitar que crezca de forma descontrolada, lo que debemos hacer es rotarlo. Para hacer esta tarea, los sistemas GNU/Linux emplean logrotate.
Logrotate tiene dos técnicas de rotación,
  • copytruncate, copia el fichero a uno nuevo y luego lo trunca.
  • no copytruncate, emplea la función rename del sistema para mover el fichero a uno nuevo. Luego el daemon que escribe necesita recibir la señal de reopen.
El problema que tenemos es que truncar el fichero de logs de MySQL puede hacer que éste se bloquee y cambiar el nombre del fichero y reiniciar el servicio, no siempre es posible, ya que dejaríamos el sistema por un tiempo sin servicio. Puede no ser mucho, pero suficiente. Para solucionar este problema, desde el blog de Percona ofrecen una solución. Lo primero es crear el fichero de configuración en logrotate (mysql-slow).
/var/log/mysql/slow_query.log {
   nocompress
   create 660 mysql mysql
   size 1G
   dateext
   missingok
   notifempty
   sharedscripts
   postrotate
      mysql -u logrotate -ppasswd -e 'select @@global.long_query_time into @lqt_save; set global long_query_time=2000; select sleep(2); FLUSH LOGS; select sleep(2); set global long_query_time=@lqt_save;'
   endscript
   rotate 150
A diferencia del código original, nosotros vamos a configurar un usuario que tenga acceso restringido al servicio MySQL para poder hacer las operaciones que necesita. El usuario será logrotate,
mysql> CREATE USER 'logrotate'@'localhost' IDENTIFIED BY 'passwd';
mysql> GRANT select,file,super,reload ON *.* TO 'logrotate'@'localhost';
La idea de crear este usuario es para evitar problemas de seguridad de acceder con root o tener el sistema sin contraseña para localhost.
Con el usuario ya creado, probamos si el fichero de configuración de logrotate funciona. Para ello,
shell> logrotate -vf /etc/logrotate.d/mysql-slow
Si no hay fallos, el fichero de logs se rotará de forma automatizada.
Leer más

/bin/bash vs. /usr/bin/env bash

Cuando estamos programando un script en bash siempre solemos inicializarlo con la línea que indica que es eso, un script en bash. Esta línea a mayores nos indica el path del intérprete. Por norma general, suele ser siempre /bin/bash/usr/bin/bash. Este "o" es el que puede causarnos algunos problemas. Para evitarlo, podemos emplear el siguiente truco: llamar a la función de enviroment. Es decir, pasamos de comenzar el script típico,
#!/bin/bash

# Código bash a ejecutar...
A usar las variables de entorno, para que sea ésta la que localice el path exacto donde está bash.
#!/usr/bin/env bash

# Código bash a ejecutar...
Con esto lo que conseguimos es hacer el script más flexible y adaptable a otros entornos donde quizás bash no esté en la misma ruta.
Leer más

Formulario de contacto

Nombre

Correo electrónico *

Mensaje *

Últimos comentarios