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é :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
#!/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 fi |
Le 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 :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#!/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 fi |
Il 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.