2010-04-26 10 views
5

Dieser Beitrag beschreibt, wie ein Kind-Prozess in einem BASH-Skript am Leben zu halten:Wie automatisch ein Python-Skript bei fehlgeschlagenem Neustart?

How do I write a bash script to restart a process if it dies?

Das für den Aufruf einer anderen BASH Skript groß gearbeitet.

Allerdings habe ich versucht, etwas Ausführung ähnlich, wo das Kind Prozess ein Python-Skript ist, daemon.py die einen gegabelten Kindprozess erstellt, der im Hintergrund läuft:

#!/bin/bash 

PYTHON=/usr/bin/python2.6 

function myprocess { 


$PYTHON daemon.py start 

} 
NOW=$(date +"%b-%d-%y") 

until myprocess; do 
    echo "$NOW Prog crashed. Restarting..." >> error.txt 
    sleep 1 
done 

nun das Verhalten ist völlig anders. Es scheint, dass das Python-Skript nicht länger ein Kind des Bash-Skripts ist, sondern die BASH-Skripte PID "übernommen" hat - es gibt also keinen BASH-Wrapper mehr um das aufgerufene Skript ... warum?

+3

Es würde helfen, zu wissen, was in daemon.py ist, aber von dem Namen ich denke, es macht eine "exec" oder was auch immer das Python-Äquivalent ist, sich in den Hintergrund zu stellen. –

+0

. Was ist t? –

+0

bearbeitet, um daemon.py zu beschreiben – chris

Antwort

5

Ein Daemon Prozess Doppel-Gabeln, als der Schlüsselpunkt der Daemonisierung selbst - so ist die PID, dass der Eltern-Prozess hat keinen Wert (es ist weg, sehr bald nach dem Kind Prozess gestartet).

Daher sollte ein Daemon-Prozess seine PID in eine Datei an einem "bekannten Ort" schreiben, wo der Parent-Prozess durch Konvention weiß, wo er ihn lesen kann; Bei diesem (traditionellen) Ansatz kann der Parent-Prozess, wenn er als Neustart-Watchdog fungieren möchte, einfach die PID des Daemon-Prozesses von dem bekannten Ort lesen und regelmäßig überprüfen, ob der Daemon noch aktiv ist, und ihn bei Bedarf neu starten.

Es bedarf natürlich einiger Sorgfalt bei der Ausführung (eine "veraltete" PID bleibt eine Weile in der Datei "well located location" und die Eltern müssen das berücksichtigen), und es gibt mögliche Varianten (den Daemon könnte einen "Herzschlag" aussenden, so dass der Elternteil nicht nur tote Daemons erkennen kann, sondern auch solche, die zB wegen eines Deadlocks "für immer feststecken", da sie ihren "Herzschlag" [via UDP-Broadcast o.ä. ] - etc etc), aber das ist die allgemeine Idee.

0

Es scheint, dass das Verhalten völlig anders ist, weil hier "daemon.py" im Hintergrund als Daemon gestartet wird.

In dem anderen Link, den Sie auf den Prozess verwiesen, ist nicht ein Daemon, beginnt es nicht im Hintergrund. Der Launcher wartet einfach ewig darauf, dass der Kindprozess aufhört.

Es gibt mehrere Möglichkeiten, dies zu beheben. Das klassische ist die Art und Weise, wie @Alex es erklärt, indem man eine PID-Datei an herkömmlichen Orten verwendet.

Ein andere Möglichkeit könnte den Watchdog in Ihrem laufenden Daemon und daemonize den Watchdog zu bauen ... dies einen korrekten Prozess simulieren würde, die nach dem Zufallsprinzip (etwas, das nicht auftreten soll) nicht brechen ...

3

Sie sollten sich den Python Enhancement Proposal 3143 (PEP) here ansehen. Darin schlägt Ben vor, eine Daemon-Bibliothek in die Python-Standardbibliothek aufzunehmen. Er geht über sehr viele Informationen über Dämonen und ist ziemlich leicht zu lesen. Die Referenzimplementierung ist here.

+0

Danke für die Referenz Paul. Sieht nützlich aus. – chris

-1

Verwenden Sie 'https://github.com/ut0mt8/simple-ha'.

einfach ha

Müde von keepalived, corosync, Schrittmacher, Herzschlag oder was auch immer? Hier ein einfacher Daemon, der einen Heartbeat zwischen zwei Hosts gewährleistet.Einer ist aktiv und der andere ist ein Backup, der beim Ändern des Status ein Skript startet. Einfache Implementierung, KISS. Produktion bereit (mindestens funktioniert es für mich :)

Das Leben wird zu einfach sein!

+1

Während dies theoretisch die Frage beantworten könnte, [wäre es vorzuziehen] (// meta.stackoverflow.com/q/8259), die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. –

+0

Danke für das Aufzeigen. Ich werde versuchen, dies so schnell wie möglich zu aktualisieren. –