Depuis quelques temps, mon serveur MySQL tombait régulièrement, sans que je sache vraiment pourquoi (et je n’ai en ce moment pas trop le temps d’aller me plonger dans les logs pour essayer de comprendre ce qu’il se passe…). En attendant de résoudre le problème, j’ai donc écrit un petit script qui va aller vérifier à intervalles régulier si le serveur est joignable, et le relancer si ce n’est pas le cas.
Au passage, le script m’envoie également le fichier log par mail, ce qui me permettra peut-être de cerner le problème 🙂
Voici le script en question, pour ceux qui en auraient l’utilité :
#!/bin/bash
if [ -f /tmp/watchdog-mysql ]; then
date | mail -s "MySQL en cours de redémarrage" ping@pong.com
else
echo "" > /tmp/watchdog-mysql
mysql -uping -ppong -e "SELECT NOW()"
if [ $? -ne 0 ]; then
/etc/init.d/mysql stop
date | mail -s "Fichier log MySQL" -a /var/log/mysql/error.log ping@pong.com
mv /var/log/mysql/error.log /var/log/mysql/error.log.`date +%Y%m%d%H%M%S`
/etc/init.d/mysql start
date | mail -s "MySQL a été redémarré" ping@pong.com
fi
rm -f /tmp/watchdog-mysql
fiLe principe est tout simple : on essaye d’exécuter une requête basique sur le serveur, si elle ne passe pas, on arrête le serveur (au cas où…), on envoie le fichier log par mail, on l’archive, puis on relance le serveur.
Le fichier /tmp/watchdog-mysql permet de vérifier que le script n’est pas déjà en train d’essayer de redémarrer MySQL.
Sur le même principe, on peut aussi monitorer Apache :
#!/bin/bash
if [ -f /tmp/watchdog-apache ]; then
date | mail -s "Apache en cours de redémarrage" ping@pong.com
else
echo "" > /tmp/watchdog-apache
wget --spider -T 2 -t 2 http://localhost/
if [ $? -ne 0 ]; then
/etc/init.d/apache2 stop
date | mail -s "Fichier log Apache" -a /var/log/apache2/error.log ping@pong.com
date | mail -s "Fichier access Apache" -a /var/log/apache2/other_vhosts_access.log ping@pong.com
mv /var/log/apache2/error.log /var/log/apache2/error.log.`date +%Y%m%d%H%M%S`
mv /var/log/apache2/other_vhosts_access.log /var/log/apache2/other_vhosts_access.log.`date +%Y%m%d%H%M%S`
/etc/init.d/apache2 start
date | mail -s "Apache a été redémarré" ping@pong.com
fi
rm -f /tmp/watchdog-apache
fiIl n’y a plus qu’à croner le tout pour ne plus avoir à relancer les services manuellement en cas de plantage et recevoir les logs par mail.
c’est moche de relancer sans comprendre ce qu’il se passe … mais c pratique aussi :p
Merci pour ce morceau de code, ça peut être utile en effet
Matt, as-tu trouvé pourquoi MySQLd se vautrait ?
J’ai dû changer de serveurs quelques semaines plus tard parce que le disque dur était mourant, les problèmes de MySQL venaient peut-être de là. Depuis je n’ai plus eu de crash.