Ich habe gelesen und verstanden, wie man einen Daemon-Prozess erstellt, aber von allem, was ich gelesen habe, habe ich nie wirklich verstandenWarumes muss getan werden.
Ich habe gelesen, dass wir Fork - Setsid - Fork verwenden, um zu verhindern, dass der Prozess die Kontrolle über ein Terminal erlangt. Aber was bedeutet das? Wenn ich ein Programm im Hintergrund mit & starte (zum Beispiel './script &' ), was ist dann der Unterschied zwischen der Ausführung dieses Prozesses und der Ausführung eines Programms, das sich selbst in einen Daemon verwandelt?
Bedeutet das einfach, dass der Hintergrundprozess angehalten wird, wenn ich mich abmelde, und der Daemon weiterläuft? Ich habe wirklich Probleme, die Sache mit der „Kontrolle über ein Terminal erlangen“ zu verstehen.
Der Grund, warum mich das stört, ist, dass ich an einem eingebetteten RPi auf einem Roboter arbeite und daher Programme beim Booten starten muss. Derzeit starte ich sie einfach von rc.local aus mit einem Befehl wie diesem su user -c 'python /home/user/launcher.py &' &
. Ich hatte noch nie ein Problem damit, dass das Programm beim Booten startet (ich kann sogar sehen, dass der Prozess ps -e
beim SSH-Zugriff auf den RPi verwendet wird), aber ich würde gerne wissen, ob es ein Risiko gibt / ob es eine schlechte Praxis ist.
Antwort1
Das ist mehr als eine Frage, jede könnte lange Antworten haben. Kurz
Wenn ich ein Programm im Hintergrund mit & starte (zum Beispiel './script &'), was ist der Unterschied in der Ausführung dieses Prozesses, als wenn ich ein Programm normal ausführe, das sich in einen Daemon verwandelt?
Wenn ein Programm im Hintergrund ausgeführt wird, wird es nicht mehr direkt vom Terminal gesteuert (Sie können
^C
es nicht einfach ausführen), es kann jedoch weiterhin in das Terminal schreiben und Ihre Arbeit stören. Normalerweise trennt sich ein Daemon vom Terminal (zusätzlich zur Aufspaltung) und seine Ausgabe/Fehler werden in Dateien umgeleitet.Bedeutet dies einfach, dass der Hintergrundprozess gestoppt wird, wenn ich mich abmelde, und der Daemon weiterläuft?
Der Hintergrundprozess könnte mit geschützt werden,
nohup
aber wenn seine Ausgabe nicht umgeleitet würde, würde das Schließen des Terminals ihn am Schreiben hindern und einen Fehler erzeugen, der ihn wahrscheinlich stoppen würde.Ich würde gerne wissen, ob ein Risiko besteht bzw. ob es eine schlechte Praxis ist.
Neben dem Problem, die Ausgabe (und Fehlermeldungen) des Programms im Auge zu behalten, besteht das Problem, es neu zu starten, wenn es abstürzt. Ein Serviceskript passt in die Art und Weise, wie die anderen Dienste auf dem System konzipiert sind, und bietet eine mehr oder weniger standardmäßige Möglichkeit, den Daemon zu steuern.