Wie Schreibe ich ein watchdog-daemon in der bash?
Ich möchte eine Art zu schreiben, der einen daemon in einer shell-Skript, das ausgeführt wird eine andere Anwendung in einer Schleife neu zu starten, wenn es stirbt.
- Bei der Ausführung mit
./myscript.sh
aus einer SSH-session, wird es starten Sie eine neue Instanz des Daemons, außer wenn der daemon bereits läuft. - Wenn die SSH-Sitzung beendet ist, wird der daemon soll bestehen bleiben.
- Es wird ein parameter (
./myscript -stop
), das tötet alle vorhandenen daemon.
(Hinweise auf Bearbeiten - Die ursprüngliche Frage angegeben, dass nohup
und ähnliche Werkzeuge dürfen nicht verwendet werden. Diese künstliche Anforderung war eine "Frage XY", und die akzeptierten Antworten in der Tat nutzt alle Werkzeuge, die der OP behauptete, waren nicht möglich.)
Warum müssen Sie die pid? Das klingt ein wenig suspekt: um einen daemon-Prozess, müssen Sie die Doppel-Gabel-trick (Gabel/setsid/Gabel). Das bedeutet, dass der startende Prozess, obwohl es sein könnte, die pid von den Enkelkindern an Sie gesendet, kann nicht warten auf den Dämon. Es ist nicht wirklich viel Verwendung für die pid von einem Dämon (der Dämon selbst konnte ihn natürlich benutzen, um in /var/run zum Beispiel, und stellen Sie sicher, es ist die einzige Kopie von sich selbst laufen).
Wenn der PID, die wir uns in diesen trick nicht verwenden, könnten Sie mir bitte ein Beispiel von der version, die Sie sagte? Weil ich habe gesehen, dass der trick vor einer Weile und kann mich nicht erinnern viele details jetzt. Ich brauche PID-genau zu vermeiden, dup. proccess. Also der Haupt-proc erhalten args wie start, stop, etc, und die Gabel sollte eine überwachungsfunktion für ein anderes proc gibt. Ich habe kein problem mit watchdog und Argumente, aber stecken mit der richtigen Verzweigung
Sie müssen erklären, dass Sie ein bisschen mehr. Sie sagen, Sie wollen ein Dämon-Prozess, das heißt, eine, die völlig losgelöst von was auch immer Sie ins Leben gerufen. Sie wollen ein anderes script Steuern können, dass der Dämon. Ist es doppelte daemon-Prozesse, die Sie versuchen zu vermeiden? In diesem Fall, am Anfang des daemon-Skript, das Sie tun sollten
also, was ist der Allgemeine Zweck dieses Skripts ist, dass es genannt werden können sagen, aus der ssh-session, wie ./my_script.sh dann wird es die Gabel selbst zum Dämon und als daemon wird es starten Sie eine andere Anwendung, führen Sie dann in Endlosschleife tun, die überprüfung jeder zweite, ob dieser Prozess ist lebendig, wenn nicht, starten Sie es neu. Wie ich bereits erwähnt habe, bin ich ziemlich viel Kenntnis von nohup, aber es nützt nichts, in meinem Fall, genauso wie auch keine cron verfügbar ist.
Ein wenig mehr, warum nicht verwenden nohup für den Aufruf dieses Skriptes: das Skript aufgerufen wird, von einem anderen ein und prüft, ob es bereits läuft, wenn nicht, dann geht es an daemon, wenn ja, beendet es verlassen daemon laufen und Berichte dieser situation, wenn top-level-Skript wurde aufgerufen mit dem parameter können sagen, zu stoppen-es wird in der Lage sein, dies zu stoppen watchdog.
Wenn der PID, die wir uns in diesen trick nicht verwenden, könnten Sie mir bitte ein Beispiel von der version, die Sie sagte? Weil ich habe gesehen, dass der trick vor einer Weile und kann mich nicht erinnern viele details jetzt. Ich brauche PID-genau zu vermeiden, dup. proccess. Also der Haupt-proc erhalten args wie start, stop, etc, und die Gabel sollte eine überwachungsfunktion für ein anderes proc gibt. Ich habe kein problem mit watchdog und Argumente, aber stecken mit der richtigen Verzweigung
Sie müssen erklären, dass Sie ein bisschen mehr. Sie sagen, Sie wollen ein Dämon-Prozess, das heißt, eine, die völlig losgelöst von was auch immer Sie ins Leben gerufen. Sie wollen ein anderes script Steuern können, dass der Dämon. Ist es doppelte daemon-Prozesse, die Sie versuchen zu vermeiden? In diesem Fall, am Anfang des daemon-Skript, das Sie tun sollten
if test -f /var/run/appname.pid; then exit; fi; echo $$ > /var/run/appname.pid; trap 'rm /var/run/appname.pid' EXIT
. Dann starten Sie den daemon mit nohup. Für die Kommunikation mit dem daemon, müssen Sie verwenden einen anderen Mechanismus der IPC sowieso (bash unterstützt FIFOs).also, was ist der Allgemeine Zweck dieses Skripts ist, dass es genannt werden können sagen, aus der ssh-session, wie ./my_script.sh dann wird es die Gabel selbst zum Dämon und als daemon wird es starten Sie eine andere Anwendung, führen Sie dann in Endlosschleife tun, die überprüfung jeder zweite, ob dieser Prozess ist lebendig, wenn nicht, starten Sie es neu. Wie ich bereits erwähnt habe, bin ich ziemlich viel Kenntnis von nohup, aber es nützt nichts, in meinem Fall, genauso wie auch keine cron verfügbar ist.
Ein wenig mehr, warum nicht verwenden nohup für den Aufruf dieses Skriptes: das Skript aufgerufen wird, von einem anderen ein und prüft, ob es bereits läuft, wenn nicht, dann geht es an daemon, wenn ja, beendet es verlassen daemon laufen und Berichte dieser situation, wenn top-level-Skript wurde aufgerufen mit dem parameter können sagen, zu stoppen-es wird in der Lage sein, dies zu stoppen watchdog.
InformationsquelleAutor Alexey Kamenskiy | 2012-08-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
Basierend auf den Erklärungen in den Kommentaren, was Sie eigentlich wollen, ist ein daemon-Prozess, hält ein Kind läuft, Relaunch, wenn es beendet wird. Sie wollen einen Weg zu geben "./myscript.sh" in einer ssh-Sitzung und den daemon gestartet.
Das Skript ausführen: starten Sie den daemon-Prozess für Sie mit nohup. Der daemon-Prozess eine Schleife, die Uhren für das Kind zu beenden, und relaunches ist es, wenn es funktioniert.
Zur Steuerung der daemon, es ist ein
-stop
argument kann das Skript nehmen, zu töten den Dämon. Blick auf Beispiele in Ihrem system der init-Skripte für mehrere komplette Beispiele mit besseren Fehlerüberprüfung.InformationsquelleAutor Nicholas Wilson
Die pid des zuletzt im hintergrund" - Prozess ist gespeichert in
$!
Ich bin nicht bewusst ein
fork
Befehl in der bash. Sind Sie sicher, dass bash das richtige tool für diesen job?wenn Sie möchten, lassen Sie einen Laufenden Prozess, die, wenn Sie hängen eine ssh-Verbindung verwendet, müssen Sie zwei Dinge tun. 1. verleugnen den Prozess, so dass Sie nicht bekommen, ein SIGHUP, wenn die Muschel stirbt, und 2. redirect alle input-und output, sonst ssh kann warten auf input/output zu schließen. Daher:
cmd </dev/null >/dev/null 2>&1 & disown
ja, ich weiß, wie es funktioniert in der Theorie und implementieren können, die es in C++ zum Beispiel. Aber wenn es um bash-Skripte, ich bin sehr oft stecken bei dieser Art von Dingen. Könnten Sie mir-code-Beispiel für diese? Ich habe versucht zu google bash fork Beispiele, aber alles deutet darauf hin, nohup, die keine Verwendung in meinem Fall.
Ich habe:
cmd </dev/null >/dev/null 2>&1 & disown
InformationsquelleAutor glenn jackman