Ich habe einen Prozess, der von init.d Skript im Hintergrund ausgeführt wird. Z.B:
case "$1" in
start)
/bin/myprocess &
stop)
killall myprocess
restart)
killall myprocess
/bin/myprocess &
esac
Unter bestimmten Umständen kann myprocess fehlschlagen und zurückkehren. Gibt es einen (Standard-) Weg, um einen Fehler zu erkennen und automatisch neu zu starten?
Antworten:
Der einfachste Weg wäre es in dem / etc / inittab , die entworfen, um diese Art der Sache zu tun:
Zum Beispiel könnten Sie dies tun:
quelle
/etc/inittab
(oder existiert sogar) genau dann, wenn Sie ein sysvinit-basiertes Init-System haben. Mit Emporkömmling und mit systemd nicht. Sie müssen entweder busybox (eine sehr primitive Shell, die das Wiederherstellen von sysadm-Aufgaben schmerzhaft macht, aber einen sysvinit-kompatiblen initd ersetzen kann) oder sysvinit (ein Fossil) installieren . In einem Docker-Container ist nur der erste nicht schmerzhaft.Buildroot verfügt über drei mögliche Init-Systeme. Dazu gibt es drei Möglichkeiten:
BusyBox
init
Damit fügt man einen Eintrag zu
/etc/inittab
.Beachten Sie, dass BusyBox
init
ein eigenwilliges/etc/inittab
Format hat. Das zweite Feld ist bedeutungslos und das erste Feld ist keine ID, sondern ein Gerätebasisname.Linux "System V"
init
Auch hier fügt man einen Eintrag hinzu
/etc/inittab
.systemd
Man schreibt eine Unit-Datei in
/etc/systemd/system/myprocess.service
:Aktivieren Sie dies, um beim Booten automatisch zu starten mit:
Starten Sie es manuell mit:
Weitere Lektüre
quelle
service mything start
oderservice mything stop
nicht mehr ... gibt es einen Weg, das Beste von beidem zu haben? dh nicht zusammenstoßbarer Sysvinit-Dienst, aber kann er auch über "Dienst" verwendet werden?Wie wäre es, eine Subshell mit einer Schleife zu erstellen, die ständig den gleichen Prozess aufruft?
Wenn es endet, wird die nächste Iteration der Schleife fortgesetzt und erneut gestartet.
Wenn die Unterschale stirbt, ist es zwar vorbei. In diesem Fall besteht die einzige Möglichkeit darin, einen weiteren Prozess zu erstellen (ich nenne ihn Nekromant), der überprüft, ob Ihr Prozess aktiv ist. Starten Sie ihn, falls dies nicht der Fall ist, und führen Sie diesen Nekromanten mit cron aus, damit Sie ihn regelmäßig überprüfen können.
Der nächste Schritt würde sich fragen, was passieren könnte, wenn cron stirbt, aber irgendwann sollten Sie sich sicher fühlen und aufhören, sich Sorgen zu machen.
quelle
Sie könnten Monit gebrauchen . Es ist sehr einfach zu bedienen und sehr flexibel. In dieser Konfiguration sehen Sie beispielsweise, wie Sie den Tomcat-Prozess bei einem Fehler neu starten.
Es enthält auch viele Konfigurationsbeispiele für viele Anwendungsfälle.
quelle
Wenn Sie kein Superuser oder Root sind und auf Ihrem Linux-System Docker installiert ist, können Sie ein Docker-Image Ihres Prozesses erstellen und den Prozess mit Docker neu starten, wenn das System neu gestartet wird.
Datei: docker-compose.yml
So starten Sie Ihren Docker-Container:
Ich finde es einfach, meinen eigenen Prozess mit automatischem Neustart abzuwickeln, wenn ich kein Superuser des Systems bin.
Ein Beispiel für die Erstellung eines Docker-Images finden Sie hier in einem kurzen Beispiel:
Datei: Dockerfile
quelle
In meinem Fall habe ich als schnelle Lösung die Lösung von @Trylks modifiziert und verwendet, um das von mir gestartete Programm zu verpacken. Ich wollte, dass es nur beim sauberen Ausgang endet.
Sollte in den meisten Shells laufen:
quelle
Sie können einen Neustarter verwenden
Verwenden Sie auf neueren Systemen systemd, um all diese trivialen Probleme zu lösen
quelle