Wieder einmal ein Beitrag zu einem meiner Linux-Lieblingstools: monit.
Wenn man einen Prozess überwachen will, der keine PID-Datei schreibt (welche die Process ID enthält), hilft monit auch hier weiter:
check process homebridge matching "homebridge" start program = "/usr/local/bin/homebridge/start.sh" stop program = "/usr/bin/pkill -f homebridge"
Läuft auf dem System ein Prozess, der „homebridge“ enthält, ist monit zufrieden. Ansonsten wird das Start-Script ausgeführt.
Das Beste: Im zu suchenden String kann man auch reguläre Ausdrücke unterbringen. Leider funktionierte aber folgende Zeichenfolge nicht:
"^homebridge$"
Auch die leicht vereinfachte Version führte zu andauernden Neustarts des Prozess, obwohl er bereits lief (d.h. monit konnte keinen laufenden Prozess finden, der auf den folgenden Ausdruck passte):
"homebridge$"
Schlussendlich half mir eine Antwort auf superuser auf den richtigen Pfad. Um interaktiv zu überprüfen, ob und wie viele Prozesse erkannt werden, loggt man sich auf das Linux-System ein und verwendet dann folgenden Befehl, um den regulären Ausdruck zu testen:
$ monit procmatch "homebridge$"
0 Prozesse. Herrje! Dabei müsste das doch anschlagen:
$ ps ax | grep -i homebridge 12345 pts/1 S+ 0:00 grep --colour=auto -i homebridge 98765 ? Sl 1:25 homebridge 43210 ? Sl 0:13 homebridge-config-ui-x
Schlussendlich brachte ich den Check folgendermassen zum Laufen:
check process homebridge matching "homebridge\s*$"
Aus irgendeinem Grund scheint der Prozessname von einem Leerzeichen, Tabulator oder dergleichen gefolgt zu werden.
Nebenbemerkung: Wieso ich überhaupt einen regulären Ausdruck verwende? Weil ich manchmal zu Debuggingzwecken auf den Linux-Server einlogge und folgendes Kommando ausführe:
$ tail -f /var/log/homebridge.log
Wenn man monit nun die Prozesse nach „homebridge“ durchsuchen lässt, wird tail von monit als homebridge-Prozess erkannt, und das abgestürzte Homebridge eben nicht neu gestartet, solange der Befehl läuft.