Script Dienst neu starten (bash)

Hallo,

ich bin neu hier und hoffe irgendjemand kann mir helfen:
Ich versuche per script (über die crontab) alle 5 Minuten prüfen zu lassen ob ein bestimmter Dienst läuft. Läuft dieser nicht so soll er neu gestartet werden. Mein erster Versuch sieht so aus:

#!/bin/sh
FTB=ps -eaf | grep fail2ban | grep -v grep | wc -l
if ["$FTB" = 0]; then
/etc/init.d/fail2ban start
else
echo „fail2ban already started“
fi
exit 0

Die Variable FTB wird sauber mit dem korrekten Wert gefüllt (0 wenn der Dienst nicht läuft, 1 wenn er 1 mal läuft, …).
Der Fehler scheint in der Bedingung der Schleife zu liegen, also habe ich die 0 in ’ ’ und in " " probiert, aber ohne Erfolg.
Ich hoffe irgendjemand hat ne Idee.

Vielen Dank für eure Mühe

MfG Steve

if ["$FTB" = 0]; then

Probiers mal mit
if [$FTB == 0]; then

weil du sonst meines Wissens FTB nur den Wert 0 zuordnest und nicht mit Null vergleichst.

oder
if [$FTB -gt 0]; then

damit sagst du, wenn FTB größer als Null ist, dann …

Gruß

Hallo,

vielen Dank erstmal für die schnelle Antwort, aber leider haben beide Varianten auch nicht funktioniert. :frowning:

MfG
Steve

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo TeaAge,

if ["$FTB" = 0]; then

if ["$FTB" = "0"]; then

ist schon richtig, wenn es sich um Zeichenketten handeln würde, bei Zahlen sollte man mit

[$FTB -eq 0]

auf Gleichheit prüfen.

Viele Grüße
Marvin

Hallo,

ich habe nun beide Varianten ausprobiert da ich mir nicht sicher bin ob er in die Variable die 0 als Zeichenkette oder Zahl schreibt:

#!/bin/sh
FTB=ps -eaf | grep fail2ban | grep -v grep | wc -l
if ["$FTB" = „0“]; then
/etc/init.d/fail2ban start
else
echo „fail2ban already started“
fi
exit 0

und

#!/bin/sh
FTB=ps -eaf | grep fail2ban | grep -v grep | wc -l
if [$FTB -eq 0]; then
/etc/init.d/fail2ban start
else
echo „fail2ban already started“
fi
exit 0

Ich habe den Dienst manuell beendet und der Befehl ps -eaf | grep fail2ban | grep -v grep | wc -l gibt mir auch eine 0 aus. Trotzdem kommt bei einem Skriptaufruf immer „fail2ban already started“.
Ich versteh das nicht.

MfG
Steve

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Ich hab mir das jetzt auch mal geschrieben.

So läuft es bei mir:

#!/bin/bash

FTB=$(ps -eaf | grep testtest.sh | grep -v grep | wc -l)
echo $FTB
if [$FTB -eq 0]
then
 echo Läuft nicht
else
 echo Läuft
fi

Gruß

Hallo Steve,
leider muss ich gleich weg, deshalb nur ein kleiner Hinweis. Normalerweise wird fail2ban (wie jeder ordentliche Dämon) auf eine andere Art überprüft (und auch gstoppt und gestartet):

fail2ban-client status

liefert dir den Status des Servers(!)
bzw.
fail2ban-client ping
gibt dir Auskunft darüber, ob der Server noch lebt.
Starten und Stoppen sollte dann entsprechend über start bzw stop erfolgen, dies ist die saubere Art solches zu tun und erspart dir fehlerträchtige dreifach-pipes. siehe

man fail2ban-client

Lass dich nicht durch das Wort client irritieren, es geht trotzdem um die Steuerung des Servers.

Vielleicht gibt es trotzdem Gründe, daß Du die Sache mit grep und wc angepackt hast, aber im Moment kann ich sie nicht sehen.

Viele Grüße
Marvin

Hallo Marvin,

vielen Dank für den Tip. Ich habe es jetzt mit dem Befehl „fail2ban-client status“ gelöst, und frage diesen regelmäßig ab. Läuft der Dienst nicht, so wird er nun vom Skript über „fail2ban-client start“ gestartet. Das funktioniert nun einwandfrei.

Vielen Dank für eure Mühe

MfG
Steve

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

danke für deine Mühe, dank dem Tip von Marvin habe ich es nun so gelöst:
#!/bin/sh
FTB=$(fail2ban-client status)
if ["$FTB" = „ERROR Unable to contact server. Is it running?“]; then
fail2ban-client start
fi
exit 0

MfG
Steve

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Steve,

#!/bin/sh
FTB=$(fail2ban-client status)
if [ „$FTB“ = „ERROR Unable to contact server. Is it
running?“ ]; then
fail2ban-client start
fi
exit 0

Naja, das ist doch schon mal ein funktionierender Ansatz. Aber da es nichts gibt, was man nicht noch verbessern könnte, lohnt es sich, das Skript etwas zu verändern. Das erste Problem ist die Abfrage auf einen Fehlerstring, das sollte immer vermieden werden. Vielleicht ändert sich die Fehlerausgabe mal, wird übersetzt und was sonst noch so sein könnte.
Deshalb ist es immer besser, direkt den exit-Code zu testen, also $?. Dies könntest Du mit [$? -eq 0] machen, ist aber immer noch zu umständlich. In solchen Fällen bietet sich die Kommandoverkettung der bash geradezu an:

befehl1 && befehl2

bedeutet, daß befehl2 nur ausgeführt wird, wenn befehl1 „erfolgreich“ ausgeführt wurde, also einen exit-code 0 hatte.
Umgekehrt gibt es dann auch diese Verkettung

befehl1 || befehl2

bei der befehl2 nur ausgeführt wurde, wenn befehl1 einen Rückkehrwert ungleich Null lieferte, also nicht erfolgreich war.
Da auch fail2ban-client solche exit-Codes liefert, würde sich das Skript so reduzieren:

fail2ban-client status \> /dev/nul || fail2ban-client start

Immer wenn der Status nicht geliefert werden kann (weil der fail2ban-Server unten ist), wird er wieder gestartet (und eben nur dann).
Das kann man noch durch eine Mail an den Admin ergänzen, damit der sich kümmert, was denn mit dem fail2bin los ist…
Noch ein paar Bemerkungen, ich würde statt status ping vorziehen, weil status eigentlich mehr Infos liefert als Du brauchst, während ping einfach nur sagt, antwortet oder antwortet nicht. Das reicht ja.
Weiterhin halte ich eine 5-minütige Abfrage für etwas übertrieben, aber gut, keine Ahnung, was bei dir alles auf dem Server passiert :wink:
Aber wenn fail2ban tatsächlich mehr als täglich abstürzt (oder nicht startet), solltest Du vielleicht doch nachsehen, warum dem so ist und diese Fehlerquelle beheben, anstatt nur einfach neu zu starten.

Viele Grüße
Marvin