Korrektes Daemon-Verhalten (von PEP 3143) erklärt

8

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.

  • Schließen Sie alle geöffneten Dateideskriptoren.
  • Ändere das aktuelle Arbeitsverzeichnis.
  • Setzen Sie die Erstellungsmaske für den Dateizugriff zurück.
  • Im Hintergrund laufen.
  • Disassociate von der Prozessgruppe.
  • I / O-Signale ignorieren.
  • Trennen Sie die Verbindung vom Steuerterminal.
  • Erwerben Sie kein Kontrollterminal.
  • Korrigieren Sie die folgenden Umstände richtig:
    • Begonnen von System V init process.
    • Daemon-Beendigung durch SIGTERM-Signal.
    • Kinder erzeugen ein SIGCLD-Signal.

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?

    
RolfBly 07.05.2014, 10:23
quelle

1 Antwort

9

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

    • Ein Daemon sollte beim Booten offensichtlich gestartet werden können.
  • Daemon-Beendigung durch SIGTERM-Signal

    • SIGTERM bedeutet Signal beenden. Beim Herunterfahren sendet der Init-Prozess normalerweise SIGTERM an alle Prozesse, wartet normalerweise 5 bis 20 Sekunden, um ihnen Zeit zum Aufräumen und Beenden zu geben. (UNP, S. 135) Auch ein Kind kann SIGTERM an seine Eltern senden, wenn seine Eltern aufhören sollten zu tun, was es tut. (UNP S. 408)
  • Kinder erzeugen ein SIGCLD-Signal

    • Stevens diskutiert SIGCHLD, nicht SIGCLD. Der Unterschied zwischen ihnen ist nicht wichtig für das Verständnis von Daemon-Verhalten. Wenn ein Kind beendet wird, sendet es SIGCHLD an seine Eltern. Wenn ein Elternteil es nicht fängt, wird das Kind ein Zombie (UNP p 118). Oh was für ein Spaß.
Als ich anfing, Antworten auf meine Frage in der UNP zu finden, fiel mir auf, dass ich wirklich mehr darüber lesen sollte. Es sind 900+ (!) Seiten von 1998 (!), Aber ich glaube, dass die Konzepte und die Erklärungen in der UNP den Test der Zeit, glorreich, bestehen. Stevens wusste nicht nur sehr gut, wovon er sprach, er verstand auch, was daran schwierig war und machte es leichter zu verstehen. Das ist wirklich selten.

    
RolfBly 07.05.2014, 10:23
quelle

Tags und Links