Shell-Skript-Problem: Cron-Job-Skript zum Neustarten des MySQL-Servers, wenn dieser versehentlich gestoppt wird

11

Ich habe dieses Skript und verwende es, um den CRON-Job für die Ausführung dieses Skripts einzurichten, damit überprüft werden kann, ob der MySQL-Dienst ausgeführt wird. Wenn nicht, wird der MySQL-Dienst neu gestartet:

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

Ich habe Cron Job als eingerichtet.

sudo crontab -e

und dann hinzugefügt,

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

Das Problem ist, dass MySQL bei jeder Cron-Jobausführung neu gestartet wird. Selbst wenn der Server ausgeführt wird, wird der MySQL-Dienst neu gestartet. Dies ist eine Korrektur im Skript, um dies zu tun.

Strohhut
quelle
Warum hast du ein "\" vor deinem Schebang? Wenn es dazu dient, dass es nicht wie ein Kommentar aussieht, ist es unnötig. Bauden sind speziell wie von Bash behandelt, wie in ihr nicht maskiert werden muß , weil sie nicht Kommentare in dem Sinne, dass ein Kommentar ein Stück Code, das wird nicht ausgewertet überhaupt .
Alexej Magura
1
Vermeiden Sie auch die Verwendung von [ ... ]oder test <TEST>in Bash. Sie sind veraltete Syntax . Verwenden Sie [[ ... ]]stattdessen. Verwenden Sie nur [ ... ]und / oder test <TEST>wenn [[ ... ]]ist nicht verfügbar.
Alexej Magura
1
Dies ist das erste Shell-Skript, das ich mithilfe einiger verfügbarer Skripte ausprobiert habe. Ich habe es nur geändert. Ich weiß nicht viel über Syntax. Problem ist immer noch da MySQL startet bei jeder CRON-Jobausführung neu @AlexejMagura
Strohhut
1
Versuchen if ! (service mysql status | grep 'mysql start/running' &>/dev/null); then sudo service mysql restart; fi Sie Folgendes : Es wird eine Subshell gestartet, in service mysql status | grep 'mysql start/running' &> /dev/nullder ausgeführt wird. Der Rückgabestatus (Exit) der Subshell wird dann an die if-Anweisung übergeben, die dann prüft, ob sie nicht Null ist. und wenn es nicht ungleich Null ist, wird der thenBlock ausgeführt.
Alexej Magura
Schreibt MySQL nicht seinen Prozess von PID zu PID-Datei? Wenn dies der Fall ist, können Sie dies als eine andere Möglichkeit verwenden, um Ihren MySQL-Status zu überprüfen
Flint

Antworten:

16

Ich vermute, dass Sie den Cron-Job so eingerichtet haben, dass dieses Skript in Ihrer Crontab-Datei und nicht in der Root-Crontab-Datei ausgeführt wird. Das ist nicht richtig , denn wenn man nicht laufen service mysql statusals root, das mysqlwird der Service nicht erkannt werden.

Ändern Sie das Skript also wie folgt:

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

Stellen Sie sicher, dass das ausführbar ist:

chmod +x /path/to/script

Fügen Sie dann einen neuen Eintrag in der Root-Crontab wie folgt hinzu:

  • Bearbeiten Sie die crontab-Stammdatei mit:

    sudo crontab -e
  • Fügen Sie der Datei die folgende Zeile hinzu:

    */1 * * * * /path/to/script
  • Hinweis: Ich habe den Cron-Job für jede Minute festgelegt, aber Sie können ihn ändern, wie Sie möchten oder wie Sie es für besser halten. Siehe http://en.wikipedia.org/wiki/Cron in diesem Sinne.

Radu Rădeanu
quelle
Ich richte es als crontab ein, ich denke, das Problem liegt im Skript, ich werde es über dem Skript versuchen
Straw Hat
./mysql-check.sh: line 2: [: =~: binary operator expectedFehler im obigen Skript
Strohhut
Ich glaube, Sie möchten diese Regex-Übereinstimmung mit negieren, !wenn Sie tatsächlich beabsichtigen, den MySQL-Dienst beim Absturz neu zu starten
Flint
@Flint Das stimmt auch ... Entschuldigung, ich trinke immer noch meinen Morgenkaffee. :)
Radu Rădeanu
@D_Vaibhav ツ Jetzt sollte alles in Ordnung sein. Versuchen Sie es jetzt als root.
Radu Rădeanu
3

Radus Antwort hätte fast funktioniert. Ich musste den Weg festlegen, damit es funktioniert:

#!/bin/bash
PATH=/usr/sbin:/usr/bin:/sbin:/bin
if [[ ! "$(service mysql status)" =~ "start/running" ]]
then
    service mysql start
fi
Donkzilla
quelle
1
Tatsächlich habe ich meine PATHin der Crontab-Datei festgelegt. Wie auch immer, in Ihrem Fall müssen Sie PATH=/usr/sbin:$PATHden vollständigen Pfad verwenden, servicewenn ich meine Antwort bearbeitet habe.
Radu Rădeanu
2

Radus Antwort funktioniert - aber dieses Skript funktioniert auch

#!/bin/bash
if [[ $(pgrep mysql | wc -l) = 0 ]];
then
    sudo service mysql start;
fi
JxAxMxIxN
quelle
Ich habe das überprüft pgrep mysqlund 0festgestellt, dass MySQL gestoppt wurde und 2ausgeführt wurde. Dafür habe ich die Bedingung als festgelegt if [[ $(pgrep mysql | wc -l) = 0 ]];und es hat bei mir funktioniert.
Alin C
wahrscheinlich besser dein Weg ... Ich werde die Änderung vornehmen.
JxAxMxIxN
Dieses Skript funktioniert mit /bin/bash(es funktioniert nicht ohne Bash). */1 * * * * /bin/bash /root/mysql-check.sh
Mahfuz