Vermeiden Sie PID-Dateien, Crones oder alles andere, was versucht, Prozesse zu bewerten, die nicht ihre Kinder sind.
Es gibt einen sehr guten Grund, warum Sie unter UNIX NUR auf Ihre Kinder warten können. Jede Methode (ps parsing, pgrep, Speichern einer PID, ...), die versucht, dies zu umgehen, ist fehlerhaft und weist klaffende Löcher auf. Sag einfach nein .
Stattdessen muss der Prozess, der Ihren Prozess überwacht, der übergeordnete Prozess sein. Was bedeutet das? Dies bedeutet, dass nur der Prozess, der Ihren Prozess startet , zuverlässig auf das Ende warten kann. In Bash ist dies absolut trivial.
until myserver; do
echo "Server 'myserver' crashed with exit code $?. Respawning.." >&2
sleep 1
done
Der obige Bash-Code wird myserver
in einer until
Schleife ausgeführt. Die erste Zeile beginnt myserver
und wartet auf das Ende. Wenn es endet, until
überprüft es seinen Exit-Status. Wenn der Exit-Status lautet 0
, bedeutet dies, dass er ordnungsgemäß beendet wurde (was bedeutet, dass Sie ihn aufgefordert haben, ihn irgendwie herunterzufahren, und dies erfolgreich). In diesem Fall möchten wir es nicht neu starten (wir haben es nur gebeten, herunterzufahren!). Wenn der Exit-Status nicht lautet 0
, until
wird der Schleifenkörper ausgeführt, der eine Fehlermeldung bei STDERR ausgibt und die Schleife (zurück zu Zeile 1) nach 1 Sekunde neu startet .
Warum warten wir eine Sekunde? Denn wenn etwas mit der Startsequenz von nicht stimmt myserver
und es sofort abstürzt, haben Sie eine sehr intensive Schleife von ständigem Neustart und Absturz an Ihren Händen. Das sleep 1
nimmt die Belastung davon weg.
Jetzt müssen Sie nur noch dieses Bash-Skript starten (wahrscheinlich asynchron), und es wird myserver
es nach Bedarf überwachen und neu starten. Wenn Sie den Monitor beim Booten starten möchten (damit der Server einen Neustart "überlebt"), können Sie ihn mit einer @reboot
Regel im Cron (1) Ihres Benutzers planen . Öffnen Sie Ihre Cron-Regeln mit crontab
:
crontab -e
Fügen Sie dann eine Regel hinzu, um Ihr Monitorskript zu starten:
@reboot /usr/local/bin/myservermonitor
Alternative; Schauen Sie sich inittab (5) und / etc / inittab an. Sie können dort eine Zeile hinzufügen, myserver
um bei einer bestimmten Init-Ebene zu beginnen und automatisch neu zu erscheinen.
Bearbeiten.
Lassen Sie mich einige Informationen hinzufügen, warum Sie keine PID-Dateien verwenden sollten. Während sie sehr beliebt sind; Sie sind auch sehr fehlerhaft und es gibt keinen Grund, warum Sie es nicht einfach richtig machen würden.
Bedenken Sie:
PID-Recycling (Tötung des falschen Prozesses):
/etc/init.d/foo start
: Start foo
, schreibe foo
die PID in/var/run/foo.pid
- Eine Weile später:
foo
stirbt irgendwie.
- Eine Weile später: Jeder zufällige Prozess, der startet (es nennt
bar
), nimmt eine zufällige PID, stellen Sie sich vor, er nimmt foo
die alte PID.
- Sie bemerken
foo
, dass es weg ist: /etc/init.d/foo/restart
liest /var/run/foo.pid
, prüft, ob es noch lebt, findet bar
, denkt foo
, tötet es, startet ein neues foo
.
PID-Dateien sind veraltet. Sie benötigen eine überkomplizierte (oder sollte ich sagen, nicht triviale) Logik, um zu überprüfen, ob die PID-Datei veraltet ist und eine solche Logik erneut anfällig ist 1.
.
Was ist, wenn Sie nicht einmal Schreibzugriff haben oder sich in einer schreibgeschützten Umgebung befinden?
Es ist sinnlose Überkomplikation; Sehen Sie, wie einfach mein Beispiel oben ist. Das muss man überhaupt nicht komplizieren.
Siehe auch: Sind PID-Dateien immer noch fehlerhaft, wenn sie richtig gemacht werden?
Apropos; Noch schlimmer als PID-Dateien ist das Parsen ps
! Tu das niemals.
ps
ist sehr unsportlich. Während Sie es auf fast jedem UNIX-System finden; Die Argumente variieren stark, wenn Sie eine nicht standardmäßige Ausgabe wünschen. Und die Standardausgabe ist NUR für den menschlichen Verzehr bestimmt, nicht für das Parsing per Skript!
- Das Parsen
ps
führt zu einer Menge falsch positiver Ergebnisse . Nehmen Sie das ps aux | grep PID
Beispiel und stellen Sie sich nun vor, jemand startet irgendwo einen Prozess mit einer Zahl als Argument, das zufällig mit der PID übereinstimmt, mit der Sie Ihren Daemon angestarrt haben! Stellen Sie sich zwei Personen vor, die eine X-Sitzung beginnen und nach X greifen, um Ihre zu töten. Es ist einfach alles schlecht.
Wenn Sie den Prozess nicht selbst verwalten möchten; Es gibt einige sehr gute Systeme, die als Monitor für Ihre Prozesse dienen. Schauen Sie sich zum Beispiel Runit an.