En esta entrada vamos a desarrollar un simple pero efectivo script para monitorizar la conexión a nuestra base de datos de PostgreSQL server.
Utilizaremos sSmtp en caso de detectar un error de comunicación, este nos enviará un email. Instalamos la aplicación:
apt-get install ssmtp
Una vez instalado vamos editamos el archivo de configuración en /etc/ssmtp/ssmtp.conf
Al final del archivo añadimos el siguiente texto, en este caso se utilizará una cuenta gmail con el «secure app» activado para poder utilizar la cuenta desde aplicaciones:
[email protected] mailhub=smtp.gmail.com:587 hostname=el_hostname_de_tu_equipo UseSTARTTLS=YES AuthUser=tucuentadecorreo AuthPass=tupassword FromLineOverride=YES
En el siguiente archivo /etc/ssmtp/revaliases, añadiremos el usuario local que tendrá permiso para enviar correos y el email de dominio con el que los enviará, añadiré los dos usuarios tanto el root como el normal:
root:[email protected]
victor:[email protected]
El siguiente paso será crear el correo que enviaremos, creamos el siguiente archivo en /var/log/postgresql/alert.msg
touch /var/log/postgresql/alert.msg
Y lo rellenamos con el siguiente texto ( o el que quieras ):
From: Database Reporter Subject: :::::: DATABASE CONNECTION DOWN :::::: ATTENTION YOUR DATABASE IS NOT ACCEPTING CONNECTIONS
Por último, lo único que queda es crear el script y darle permisos de ejecución:
touch reporter
chmod 755 reporter
#!/bin/bash touch /var/log/postgresql/monitor_log.log db=nuestra_base_de_datos port=5432 accept=0 echo pg_isready -d "$db" -p "$port" --quiet if [ "$?" -eq "$accept" ] then date >> /var/log/postgresql/monitor_log.log && echo "The database "$db":"$port" is accepting connections" >> /var/log/postgresql/monitor_log.log else ssmtp [email protected],[email protected] < alert.msg && date >> /var/log/postgresql/monitor_log.log && echo "The database "$db":"$port" IS NOT ACCEPTING CONNECTIONS, SENDING EMAIL" >> /var/log/postgresql/monitor_log.log fi
Expliquemos que hace exactamente el script escrito arriba, Primeramente inicializa el fichero monitor_log.log. la variable accept es igual a 1, por qué motivo?. Siguiendo la documentación oficial de postgresql relacionada con pg_isready, la puedes leer aquí, como podemos ver existen las siguientes relaciones en relación al comando $?
0 sería igual a = servidor accepta conexiones
1 sería igual a = servidor rechaza conexiones
2 sería igual a = el servidor no da respuesta
Cabe destacar que la variable «$?» corresponde a una variable de sistema la cual nos muestra mediante un valor el resultado numérico del último comando ejecutado, por norma general 0 suele ser un estado correcto y 1, 2 o 3 incorrecto.
En nuestro caso comparamos si el resultado de $? es igual a accept, o lo que es lo mismo 0. En caso de ser afirmativo añadiría al fichero de log la fecha de comprobación y un Status OK. Si esta comparación es distinta a 0 significará que nuestro servidor o no responde o no está aceptado conexiones a la base de datos por lo que nos enviará un email de alerta a las direcciones indicadas.
Recuerda que si ejecutamos el script desde un usuario «plano» tendremos que añadir la ruta completa hacía el ssmtp, en este caso /usr/sbin/ssmtp [email protected],[email protected] < alert.msg
En la siguiente entrada podrás ver un script similar al encontrado aquí para realizar un backup en linux.
¡Hasta la próxima!