Automatischer Neustart eines Jobs bei Absturz

Manchmal hat man Jobs die einfach nur laufen müssen (z. b. NIS Server, Name Server). Und wenn sie einmal abstürzen, interessiert mich erst einmal gar nicht das Warum. Vielmehr möchte ich das der Jobs einfach wieder los läuft – Am besten von allein. Die näheren Umstände des Absturzes kann ich ja später noch anhand des Logfiles untersuchen. Unter Solaris gibt es hierzu die Service Management Facility (SMF), die sicher stellt, dass Systemdienste laufen und nötigenfalls auch einen (oder mehrere) Neustart(s) des Dienstes versucht, falls dieser abstürzen sollte. Unter Linux habe ich noch kein Äquivalent dazu gefunden. Eine brutale Methode einen Job bei gelegentlichen Abstürzen automatisch erneut zu starten, ist, ihn in einer Endlosschleife aufzurufen:

while true; do ./jobs.sh; done

Diese Methode geht allerdings nach hinten los, falls jobs.sh ein ernsthaftes Problem hat und sofort nach dem Start wieder terminiert. Zur Sicherheit sollte man also die Neustartorgie durch einen Zähler begrenzen, z. B. auf 1000 Versuche:

for i in {1..1000}; do ./jobs.sh; done

Das ist nicht elegant, hilft aber gelegentlich abstürzende Programme am Laufen zu halten.  Ist der kritische Zählerstand erreicht, wird nicht weiter versucht den Job neu zu starten. Man kann sich hierüber z. B. per Mail an root an  informieren lassen:

for i in {1..1000}; do ./jobs.sh; done ; echo "Message" | mail -s "Job died." root

Zimbra LDAP error

Beim Start von Zimbra 7.1.1 unter CentOS 5.7 kommt es bisweilen zu Fehlern mit dem LDAP, die verhindern, dass Zimbra startet:

[root@zimbra ~]# /etc/init.d/zimbra restart
Host zimbra.frdom.local
Stopping stats...Done.
Stopping mta...Done.
Stopping spell...Done.
Stopping snmp...Done.
Stopping cbpolicyd...Done.
Stopping archiving...Done.
Stopping antivirus...Done.
Stopping antispam...Done.
Stopping imapproxy...Done.
Stopping memcached...Done.
Stopping mailbox...Done.
Stopping logger...Done.
Stopping zmconfigd...Done.
Stopping ldap...Done.
Host zimbra.frdom.local
Starting ldap...Done.
Failed.
Failed to start slapd. Attempting debug start to determine error.
bdb(): PANIC: fatal region error detected; run recovery
bdb_db_close: database "": txn_checkpoint failed: Invalid argument (22).
backend_startup_one (type=hdb, suffix=""): bi_db_open failed! (-30974)
bdb_db_close: database "": alock_close failed

Ich vermute, dass das mit Inkonsistenzen im LDAP zusammenhängt. Die Zimbra-Instanz läuft in einer VirtualBox auf OpenIndiana 151a und ich denke, dass der Fehler durch die Virtualisierung verursacht wird (möglicherweise Dateisystemprobleme auf dem Host oder Gastsystem oder Problem beim “sauberen” hoch- und runterfahren der VM). Ich hatte bisher nicht die Energie, die Zeit und den nötigen Durchblick, dass Problem zu analysieren. Deshalb hier erst einmal der Fix, der den LDAP repariert. Hat bis jetzt immer gut funktioniert (heilt evtl. auch andere LDAP-Datenbankfehler):

[root@zimbra ~]# su - zimbra
[zimbra@zimbra ~]$ cd /opt/zimbra/data/ldap/hdb/db
[zimbra@zimbra db]$ db_recover -v
Finding last valid log LSN: file: 4 offset 6038659
Recovery starting from [4][6038514]
Recovery complete at Tue Mar 6 16:43:08 2012
Maximum transaction ID 80000015 Recovery checkpoint [4][6038659]
[zimbra@zimbra db]$ logout

Wenn das geklappt hat kann Zimbra gestartet werden (habe hier restart benutzt):

root@zimbra ~]# /etc/init.d/zimbra restart
Host zimbra.frdom.local
Stopping stats...Done.
Stopping mta...Done.
Stopping spell...Done.
Stopping snmp...Done.
Stopping cbpolicyd...Done.
Stopping archiving...Done.
Stopping antivirus...Done.
Stopping antispam...Done.
Stopping imapproxy...Done.
Stopping memcached...Done.
Stopping mailbox...Done.
Stopping logger...Done.
Stopping zmconfigd...Done.
Stopping ldap...Done.
Host zimbra.frdom.local
Starting ldap...Done.
WARNING: Disk space below threshold for /opt/zimbra.
Starting zmconfigd...Done.
Starting logger...Done.
Starting mailbox...Done.
Starting memcached...Done.
Starting antispam...Done.
Starting antivirus...Done.
Starting snmp...Done.
Starting spell...Done.
Starting mta...Done.
Starting stats...Done.
[root@zimbra ~]# 

Et voila.