Ich habe einige Aufgaben [für mein RPi] in Python, die eine Menge von sleep
ing beinhalten: mache etwas, das eine Sekunde oder zwei oder drei braucht, dann warte einige Minuten oder Stunden.
Ich möchte die Kontrolle zurück an das Betriebssystem (Linux) in dieser Ruhezeit übergeben. Dafür sollte ich diese Aufgaben dämonisieren. Eine Möglichkeit besteht darin, Pythons Standard-Daemon-Prozessbibliothek zu verwenden.
Aber Dämonen sind nicht so einfach zu verstehen. Gemäß dem Rational-Abschnitt von PEP 3143 sollte sich ein gut erzogener Daemon eignen folgende.
Für einen Linux / Unix-Neuling wie mich ist das kaum eine Erklärung. Aber ich möchte wissen, warum ich mache, was ich tue. Was ist der Grund für diese Logik?
PEP 3142 hat diese Anforderungen von Unix-Netzwerkprogrammierung ("UNP") übernommen der verstorbene W. Richard Stevens. Die folgende Erklärung wird aus diesem Buch zitiert oder zusammengefasst. Es ist nicht so einfach online zu finden, und es kann illegal sein, es herunterzuladen. Also lieh ich es mir aus der Bibliothek aus. Seiten, auf die Bezug genommen wird, sind in der zweiten Ausgabe, Band 1 (1998). (Die PEP bezieht sich auf die erste Ausgabe, 1990.)
Schließen Sie alle geöffneten Dateideskriptoren.
"Wir schließen alle offenen Deskriptoren, die von dem Prozess, der den Daemon ausgeführt hat, geerbt haben. [..] Einige Daemons öffnen
/dev/null
zum Lesen und Schreiben und duplizieren den Deskriptor auf Standardeingabe, Standardausgabe und Standardfehler . "
(Dieser 'Howdy World' Python-Daemon demonstriert dies.)
"Dies garantiert, dass die allgemeinen Deskriptoren offen sind, und ein Lesen von irgendeinem dieser Deskriptoren gibt 0 (End Of File) zurück, und der Kernel verwirft alles, was in einen dieser drei Deskriptoren geschrieben wurde. Der Grund für das Öffnen dieser Deskriptoren ist so dass jede vom Daemon aufgerufene Bibliotheksfunktion, die davon ausgeht, dass sie von der Standardeingabe lesen oder in die Standardausgabe oder den Standardfehler schreiben kann, nicht fehlschlägt Alternativ öffnen einige Daemons eine Protokolldatei, in die sie beim Ausführen schreiben und deren Deskriptor nach Standard duplizieren Ausgabe und Standardfehler ". (UNP S. 337)
Ändere das aktuelle Arbeitsverzeichnis
"Ein Druckerdämon wechselt möglicherweise in das Spoolverzeichnis des Druckers, wo er seine ganze Arbeit erledigt. [...] Der Daemon könnte irgendwo im Dateisystem gestartet worden sein, und wenn er dort bleibt, kann das Dateisystem nicht abgehängt werden. " (UNP p 337)
Warum möchten Sie ein Dateisystem aushängen? Zwei Gründe:
1. Sie möchten Verzeichnisse, die mit Benutzerdaten aus Verzeichnissen für das Betriebssystem gefüllt werden können, trennen (und in der Lage sein, sie zu mounten und unmounten).
2. Wenn Sie einen Daemon von zB einem USB-Stick starten, möchten Sie diesen Stick unmounten, ohne den Daemon zu stören.
Setzen Sie die Erstellungsmaske für den Dateizugriff zurück.
"Wenn also der Daemon seine eigenen Dateien erstellt, wirken sich die Berechtigungsbits in der Erstellungsmaske für geerbte Dateimodi nicht auf die Berechtigungsbits der neuen Dateien aus." (UNP, S. 337)
Im Hintergrund ausführen.
Per Definition
"Ein Daemon ist ein Prozess, der im Hintergrund abläuft und unabhängig von der Kontrolle aller Terminals ist". (UNP S. 331)
Disassoziieren von Prozessgruppe.
Um dies zu verstehen, müssen Sie verstehen, was eine Prozessgruppe ist, und das bedeutet, dass Sie wissen müssen, was fork
tut.
Was fork tut
? fork
ist die einzige Möglichkeit (in Unix) einen neuen Prozess zu erstellen. (In Linux gibt es auch clone
). Schlüssel zum Verständnis fork
ist, dass es zweimal zurückgibt, wenn es (einmal) aufgerufen wird: einmal im aufrufenden Prozess (= parent) mit der Prozess-ID des neu erstellten Prozesses (= child) und einmal in das Kind. "Alle Deskriptoren, die der Eltern beim Forken bekannt sind, werden mit dem Kind geteilt, wenn die Gabel zurückkehrt." (UNP S. 102).
Wenn ein Prozess ein anderes Programm ausführen möchte, erstellt er einen neuen Prozess, indem er fork aufruft, der eine Kopie von sich selbst erstellt. Dann ruft einer von ihnen (normalerweise das Kind) das neue Programm an. (UNP, S. 102)
Warum trennen Sie die Zuordnung von der Prozessgruppe
Der Punkt ist, dass ein Sitzungsleiter ein kontrollierendes Terminal erwerben kann. Ein Daemon sollte dies niemals tun, er muss im Hintergrund bleiben. Dies wird erreicht, indem fork
zweimal aufgerufen wird: Die übergeordneten Forks erstellen ein untergeordnetes Kind, die untergeordneten Forts erstellen ein Enkelkind. Elternteil und Kind werden beendet, aber das Enkelkind bleibt übrig. Aber weil es ein Enkelkind ist, ist es kein Sitzungsleiter und kann daher kein kontrollierendes Terminal erwerben. (Zusammengefasst aus UNP Abs. 12, S. 335)
Die Doppelgabel wird ausführlicher besprochen hier und in den Kommentaren unten.
I / O-Signale ignorieren.
"Signale, die von Terminal-Schlüsseln erzeugt werden, dürfen keine Dämonen beeinflussen, die früher von diesem Terminal gestartet wurden". (UNP S. 331)
Trennen Sie sich vom Steuerterminal und erwerben Sie kein Steuerterminal mehr.
Inzwischen sind die Gründe offensichtlich:
"Wenn der Daemon von einem Terminal gestartet wird, möchten wir das Terminal für andere Aufgaben zu einem späteren Zeitpunkt verwenden können.Wenn wir beispielsweise den Dämon von einem Terminal aus starten, das Terminal abmelden und sich jemand anderes an diesem Terminal anmeldet, wollen wir keine Dämon-Fehlermeldungen während der Terminal-Sitzung des nächsten Benutzers anzeigen. "(UNP p 331)
Korrigieren Sie die folgenden Umstände richtig:
Gestartet von System V init process
Daemon-Beendigung durch SIGTERM-Signal
Kinder erzeugen ein SIGCLD-Signal