Kann man da auch speziell einstellen, dass er nur einen Neustart machen soll, wenn die Homebridge stehen geblieben ist?
Mit dem Watchdog geht das nicht. Man müsste also selber etwas basteln, was einerseits ganz einfach, andererseits aber nicht ganz trivial ist.
Wenn man seine Homebridge mit dem systemd kontrolliert (was man daran erkennt, dass der Befehl systemctl verwendet wird), dann wird die Homebridge immer dann automatisch neu gestartet, wenn sie abgestürzt ist. Das ist schon mal ziemlich praktisch. Sie wird aber nicht automatisch neu gestartet, wenn sie absichtlich angehalten wurde.
Absturz und Anhalten sind zwei grundverschiedene Dinge. Absturz ist das, was man nicht will, während Anhalten meist ein manueller Prozess ist, der mit dem Befehl sudo systemctl stop homebridge ausgelöst wird. Was beide gemein haben ist die Tatsache, dass danach die Homebridge nicht mehr läuft. Und während nach dem Crash die Homebridge neugestartet wird (das will man so), wird sie nicht neugestartet, wenn man sie vorsätzlich angehalten hat (das will man auch so).
Leider kommt es vor, dass die Homebridge von einem Plugin angehalten wird. Das Plugin fährt aus irgendwelchen Gründen an die Wand und kann nicht weiter ausgeführt werden, aber die Homebridge schmiert dabei nicht ab, sondern wird von dem Plugin angehalten. Das wird erzeugt durch gute Programmierung und ein gutes sogenanntes error handling. Das Plugin homebridge-zp zur Steuerung von Sonos-Geräten macht das beispielsweise so, weil es sich im Fehlerfalle unbedingt noch von der Sonos-Anlage abmelden will. Wenn es das nicht täte, würde nach einer Weile keine neue Anmeldung mehr möglich sein. Es gibt sicherlich auch andere Plugins, die sich ähnlich verhalten. Nur ist genau das richtig blöd für uns .
Da die Homebridge vom Plugin angehalten wurde, wird sie vom systemd nicht neu gestartet. Der hat nämlich ein Signal bekommen, dass alles so seine Richtigkeit hat und die Homebridge nicht laufen soll. Das ist natürlich ziemlich uncool, wenn man sich gerade weit entfernt von seinem Setup befindet, beispielsweise in Timbuktu oder in Hammerfest, und man keine Möglichkeit hat, das Ding wieder zu starten.
Da könnte jetzt ein kleines Skript helfen, das prüft ob die Homebridge läuft und das korrigierend eingreift, falls das nicht der Fall sein sollte. Diese Skript könne den Zustand beispielsweise einmal pro Minute abfragen und dann irgendwas tun (Neustart des Raspi oder Neustart der Homebridge). Was unweigerlich dazu führt, dass man seine Homebridge selber nicht mehr anhalten kann. Ein manuell eingegebenes sudo systemctl stop homebridge würde immer dazu führen, dass kurz darauf der Raspi neu gestartet wird. Und wenn dann die Homebridge aus irgendwelchen Gründen tatsächlich nicht startet, die Schüssel in einen wunderschönen Boot-Loop verfällt, der einem den ganzen Monat versauen kann, vor allem dann, wenn der vierwöchige Urlaub in Hammerfest gerade begonnen hat.
Selbst wenn man nur die Homebridge neu starten will und nicht gleich den ganzen Raspi, kann einen ein Neustart der Homebridge nerven. Du hältst die Homebridge absichtlich an, dein Rechner startet sie neu. Lästig.
Wie dem auch sei, ein Aufpasser-Skript könnte so aussehen:
sudo nano /usr/local/bin/homebridge-watcher.sh
#!/bin/bash
/usr/bin/curl http://localhost:51826
if [ $? != 0 ]; then
sudo systemctl restart homebridge
fi
chmod +x sudo nano /usr/local/bin/homebridge-watcher.sh
Dann einen cron job erstellen, der das Skript alle 5 Minuten aufruft:
sudo nano /etc/crontab
und unter die letzte Zeile einfügen:
*/5 * * * * root /usr/local/bin/homebridge-watcher.sh >/dev/null 2>&1
Testen mit:
sudo systemctl stop homebridge und warten. Das Skript wird alle fünf Minuten aufgerufen, also beispielsweise 11:00 Uhr, dann um 11:05 Uhr, dann um 11:10 Uhr und so weiter und so fort. Wenn man den cron job allerdings erst um 11:04 Uhr installiert, läuft das Skript zum ersten Mal um 11:10 Uhr. Abwarten.
Stefan