2016-07-25 9 views
0

Ich sah mich auf GitHub um, als ich über diese Methode namens daemonize() in einem umgekehrten Shell-Beispiel stolperte. sourceWas macht diese Daemon-Methode?

Was ich nicht ganz verstehe ist, was es in diesem Zusammenhang der Fall ist, würde diesen Code von der Befehlszeile als solche nicht ausgeführt wird: python example.py & nicht das Gleiche erreichen?

Deamonize Methode Quelle:

def daemonize(): 
    pid = os.fork() 
    if pid > 0: 
     sys.exit(0) # Exit first parent 
    pid = os.fork() 
    if pid > 0: 
     sys.exit(0) # Exit second parent 
+1

Siehe [Was ist der Unterschied zwischen der Ausführung eines Programms als Daemon und Forking in den Hintergrund mit '&'?] (Http://unix.stackexchange.com/questions/56495/whats-the-difference-between-running) -a-Programm-als-Daemon-und-Forking-It-in) –

Antwort

1

Ein Hintergrundprozess - python2.7 <file>.py mit dem & Signal ausgeführt - ist nicht dasselbe wie ein echter Daemon-Prozess.

Ein echter Dämon-Prozess:

  • Wird im Hintergrund ausgeführt. Dies passiert auch, wenn Sie & verwenden und die Ähnlichkeit endet.
  • Befindet sich nicht in derselben Prozessgruppe wie das Terminal. Wenn das Terminal geschlossen wird, stirbt der Daemon auch nicht. Dies geschieht nicht mit & - der Prozess bleibt gleich, es wird einfach in den Hintergrund verschoben.
  • Korrekt schließt alle geerbten Dateideskriptoren (einschließlich Eingabe, Ausgabe usw.), so dass nichts zurück an den übergeordneten bindet. Auch dies passiert nicht mit & - es wird immer noch auf das Terminal schreiben.
  • Sollte nur idealerweise von SIGKILL getötet werden, nicht SIGHUP. Wenn Sie & ausführen, kann Ihr Prozess mit SIGHUP beendet werden.

All dies ist jedoch Pedanterie. Wenige Aufgaben erfordern wirklich, dass Sie zu dem Extrem gehen, das diese Eigenschaften erfordern - eine Hintergrundaufgabe, die in einem neuen Terminal unter Verwendung von screen erzeugt wird, kann normalerweise den gleichen Job erledigen, wenn auch weniger effizient, und Sie können auch einen Daemon nennen lang andauernde Hintergrundaufgabe. Der einzige wirkliche Unterschied zwischen , und einem echten Daemon ist, dass letzterer einfach versucht, alle möglichen Wege des Todes zu vermeiden.

Der Code, den Sie sahen, gab einfach den aktuellen Prozess frei. Im Wesentlichen klont es den aktuellen Prozess, tötet seinen Elternteil und "handelt im Hintergrund", indem er einfach ein separater Prozess ist, der die aktuelle Ausführung nicht blockiert - ein bisschen ein hässlicher Hack, wenn Sie mich fragen, aber es funktioniert.

1

Werfen Sie einen Blick auf Orphan Processes und Daemon Process. Ein Prozess ohne Eltern wird ein Kind von init (pid 1).

Wenn es an der Zeit ist, eine Gruppe von Prozessen herunterzufahren, sagen wir allen Kindern einer Bash-Instanz, wird das OS den Kindern dieser Bash einen Seufzer geben. Eine Waise, die wie in diesem Fall oder aufgrund eines anderen Unfalls gezwungen wird, wird diese Behandlung nicht bekommen und wird länger bleiben.