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 
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