Problème de script shell: script de tâche cron pour redémarrer le serveur MySQL lorsqu'il s'arrête accidentellement

11

J'ai ce script, je l'utilise pour configurer le travail CRON pour exécuter ce script, afin qu'il puisse vérifier si le service MySQL est en cours d'exécution; sinon, il redémarre le service MySQL:

#!/bin/bash
service mysql status| grep 'mysql start/running' > /dev/null 2>&1
if [ $? != 0 ]
then
    sudo service mysql restart
fi

J'ai configuré le travail cron en tant que.

sudo crontab -e

puis ajouté,

*/1 * * * * /home/ubuntu/mysql-check.sh

Le problème est qu'il redémarre MySQL à chaque exécution de tâche cron .. même si le serveur est en cours d'exécution, redémarrez le service MySQL quelle correction dans le script pour faire cela.

Chapeau de paille
la source
pourquoi avez-vous un `\ 'devant votre shebang? S'il est là pour l'empêcher de ressembler à un commentaire, alors c'est inutile. Les shebangs sont traités comme Bash, car ils n'ont pas besoin d'être échappés car ils ne sont pas des commentaires dans le sens où un commentaire est un morceau de code qui n'est pas évalué du tout .
Alexej Magura
1
Évitez également d'utiliser [ ... ]ou test <TEST>dans Bash. Ils sont obsolètes . Utilisez [[ ... ]]plutôt. Utiliser uniquement [ ... ]et / ou test <TEST>quand [[ ... ]]n'est pas disponible.
Alexej Magura
1
c'est le premier script shell que j'ai essayé en utilisant certains scripts disponibles, je viens de le modifier. Je ne connais pas grand chose à la syntaxe. le problème est toujours là mysql redémarre à chaque exécution de job CRON @AlexejMagura
Straw Hat
1
Essayez quelque chose comme ceci: if ! (service mysql status | grep 'mysql start/running' &>/dev/null); then sudo service mysql restart; fi ce que cela fait, c'est qu'il démarre un sous-shell, dans lequel service mysql status | grep 'mysql start/running' &> /dev/nullest exécuté, le statut de retour (sortie) dudit sous-shell est ensuite transmis à l'instruction if, qui vérifie ensuite si elle n'est pas nulle, et s'il n'est pas différent de zéro, il exécute le thenbloc.
Alexej Magura
Mysql n'écrit-il pas son processus pid dans un fichier pid? Si c'est le cas, vous pouvez utiliser cela comme un autre moyen de vérifier votre statut mysql
Flint

Réponses:

18

Je soupçonne que vous avez configuré le travail cron pour exécuter ce script dans votre fichier crontab, et non dans le fichier racine crontab. Ce n'est pas correct car si vous ne vous exécutez pas enservice mysql status tant que root, le mysqlservice ne sera pas reconnu.

Modifiez donc le script comme suit:

#!/bin/bash
if [[ ! "$(/usr/sbin/service mysql status)" =~ "start/running" ]]
then
    /usr/sbin/service mysql start
fi

Assurez-vous que c'est exécutable:

chmod +x /path/to/script

Ajoutez ensuite une nouvelle entrée dans la racine crontab comme suit:

  • Modifiez le fichier crontab racine en utilisant:

    sudo crontab -e
  • Et ajoutez la ligne suivante au fichier:

    */1 * * * * /path/to/script
  • Remarque: J'ai défini le travail cron pour chaque minute, mais vous pouvez changer comme vous le souhaitez ou comme vous le pensez. Voir http://en.wikipedia.org/wiki/Cron dans ce sens.

Radu Rădeanu
la source
Je l'ai configuré comme crontab, je suppose que le problème est avec le script, je vais essayer le script ci-dessus
Chapeau de paille
./mysql-check.sh: line 2: [: =~: binary operator expectederreur dans le script ci-dessus
Chapeau de paille
Je crois que vous voulez annuler cette correspondance d'expression régulière avec !si vous avez réellement l'intention de redémarrer le service mysql en cas de panne
Flint
@Flint C'est vrai aussi ... Désolé, je bois toujours mon café du matin. :)
Radu Rădeanu
@D_Vaibhav ツ Maintenant, tout devrait être OK. Alors, essayez maintenant, en tant que root.
Radu Rădeanu
3

La réponse de Radu a presque fonctionné. J'ai dû définir le chemin pour le faire fonctionner:

#!/bin/bash
PATH=/usr/sbin:/usr/bin:/sbin:/bin
if [[ ! "$(service mysql status)" =~ "start/running" ]]
then
    service mysql start
fi
Donkzilla
la source
1
En fait, je l'ai mis PATHdans le fichier crontab. Quoi qu'il en soit, dans votre cas, vous devez utiliser PATH=/usr/sbin:$PATHou utiliser le chemin complet pour servicecomme j'ai édité ma réponse.
Radu Rădeanu
2

La réponse de Radu fonctionne - mais ce script fonctionne également

#!/bin/bash
if [[ $(pgrep mysql | wc -l) = 0 ]];
then
    sudo service mysql start;
fi
JxAxMxIxN
la source
J'ai vérifié pgrep mysqlet j'ai obtenu 0que mysql soit arrêté et que je 2cours. Pour cela, j'ai mis la condition if [[ $(pgrep mysql | wc -l) = 0 ]];et cela a fonctionné pour moi.
Alin C
probablement mieux votre chemin ... je ferai le changement.
JxAxMxIxN
Ce script fonctionne avec /bin/bash(il ne fonctionne pas sans bash). */1 * * * * /bin/bash /root/mysql-check.sh
mahfuz