
Ich habe den folgenden Cron-Job und er läuft alle 5 Minuten (er funktioniert tatsächlich)
#!/bin/bash
PATH=/usr/sbin:/usr/bin:/sbin:/bin
if [[ "$(/usr/sbin/service mysql status)" != *start/running* ]]
then
echo "MySQL restarted" | mail -a FROM:*@* -s "[Marketing Server] Database Service" *@*
sudo service mysql start
fi
Beim Ausführen von MySQL-Status (wird ausgeführt)
mysql.service - LSB: Start and stop the mysql database server daemon Loaded: loaded (/etc/init.d/mysql) Active: active (exited) since Wed 2015-12-09 15:01:40 GMT; 21h ago Docs: man:systemd-sysv-generator(8) Process: 30829 ExecStop=/etc/init.d/mysql stop (code=exited, status=0/SUCCESS) Process: 30910 ExecStart=/etc/init.d/mysql start (code=exited,status=0/SUCCESS)
Dec 10 12:10:02 MarketingServer systemd[1]: Started LSB: Start and stop the .... Dec 10 12:15:02 MarketingServer systemd[1]: Started LSB: Start and stop the .... Dec 10 12:20:02 MarketingServer systemd[1]: Started LSB: Start and stop the .... Dec 10 12:25:01 MarketingServer systemd[1]: Started LSB: Start and stop the .... Dec 10 12:30:02 MarketingServer systemd[1]: Started LSB: Start and stop the .... Dec 10 12:35:01 MarketingServer systemd[1]: Started LSB: Start and stop the .... Dec 10 12:40:01 MarketingServer systemd[1]: Started LSB: Start and stop the .... Dec 10 12:45:02 MarketingServer systemd[1]: Started LSB: Start and stop the .... Dec 10 12:50:02 MarketingServer systemd[1]: Started LSB: Start and stop the .... Dec 10 12:55:01 MarketingServer systemd[1]: Started LSB: Start and stop the .... Hint: Some lines were ellipsized, use -l to show in full.
beim Ausführen von MySQL-Status (gestoppt)
david@MarketingServer:~$ sudo service mysql stop ^[[Adavid@MarketingServer:~$ sudo service mysql status ● mysql.service - LSB: Start and stop the mysql database server daemon Loaded: loaded (/etc/init.d/mysql) Active: inactive (dead) since Thu 2015-12-10 13:03:26 GMT; 1s ago Docs: man:systemd-sysv-generator(8) Process: 5024 ExecStop=/etc/init.d/mysql stop (code=exited, status=0/SUCCESS) Process: 30910 ExecStart=/etc/init.d/mysql start (code=exited, status=0/SUCCESS)
Dec 10 12:35:01 MarketingServer systemd[1]: Started LSB: Start and stop the .... Dec 10 12:40:01 MarketingServer systemd[1]: Started LSB: Start and stop the .... Dec 10 12:45:02 MarketingServer systemd[1]: Started LSB: Start and stop the .... Dec 10 12:50:02 MarketingServer systemd[1]: Started LSB: Start and stop the .... Dec 10 12:55:01 MarketingServer systemd[1]: Started LSB: Start and stop the .... Dec 10 13:00:02 MarketingServer systemd[1]: Started LSB: Start and stop the .... Dec 10 13:03:24 MarketingServer systemd[1]: Stopping LSB: Start and stop the.... Dec 10 13:03:24 MarketingServer mysql[5024]: * Stopping MySQL database serve...d Dec 10 13:03:26 MarketingServer mysql[5024]: ...done. Dec 10 13:03:26 MarketingServer systemd[1]: Stopped LSB: Start and stop the .... Hint: Some lines were ellipsized, use -l to show in full.
Das einzige Problem, das ich habe, ist, dass jedes Mal eine E-Mail gesendet wird, in der steht, dass der Dienst neu gestartet wurde, auch wenn dies nicht der Fall ist. Ich möchte, dass die E-Mail nur gesendet wird, wenn der Dienst tatsächlich aus dem gestoppten Zustand neu gestartet wurde.
Kann mir jemand erklären, welchen Teil ich falsch verstanden habe?
Antwort1
Es gibt ein paar Probleme in Ihrer if-Anweisung. Der „ !
am Anfang des Bedingungstests“ bedeutet, dass Sie prüfen, ob der Ausdruck "$(/usr/sbin/service mysql status)"
falsch ist, was nicht das ist, was Sie erreichen möchten. Sie möchten überprüfen, dass das Ergebnis des Servicestatusbefehls keine Zeichenfolge ist, die „Start/Warten“ enthält. !=
ist die beste Möglichkeit, „ungleich“ zu sagen.
Außerdem =~
wird ein regulärer Ausdruck erwartet, bei dem Sie nur einen Teil der Zeichenfolge angeben, den Sie erwarten. Da die Syntax mit doppelten Klammern von if-Anweisungen Shell-Globbing unterstützt, können Sie mit nach „Start/Warten“ suchen *start/waiting*
.
Wenn Sie die Zeile ändern:
if [[ ! "$(/usr/sbin/service mysql status)" =~ "start/running" ]]
Zu:
if [[ "$(/usr/sbin/service mysql status)" != *start/running* ]]
Ihr Skript sollte ordnungsgemäß funktionieren, andernfalls glaube ich, dass Sie den Dienst jedes Mal neu starten und eine E-Mail senden, wenn das Skript ausgeführt wird.
BEARBEITEN:
Das Folgende ist keine ideale Lösung. Ich poste es nur, um zu versuchen, Ihnen bei der aktuellen Situation zu helfen, in der Sie sich befinden.
Um mit der Ausgabe von fertig zu werden, systemd-sysv-generator
können Sie versuchen, die erste Zeile der if
Anweisung durch Folgendes zu ersetzen:
if [[ "$(/usr/sbin/service mysql status)" = *inactive* ]]