Wie funktioniert DAEMON(3)? Als Hintergrundprozess ausführen

Wie funktioniert DAEMON(3)? Als Hintergrundprozess ausführen

Welche Schritte sind erforderlich, um den Prozess vom Terminal zu trennen? Dazu habe ich die Manpage von gefundendaemon()In der Beschreibung heißt es

Wenn nochdir Null ist, ändert daemon() das aktuelle Arbeitsverzeichnis des Prozesses in das Stammverzeichnis ("/"). Andernfalls bleibt das aktuelle Arbeitsverzeichnis unverändert.

Wenn noclose Null ist, leitet daemon() die Standardeingabe, Standardausgabe und Standardfehlerausgabe nach /dev/null um. Andernfalls werden an diesen Dateideskriptoren keine Änderungen vorgenommen.

Eigentlich wollte ich meinen Python-Code als Daemon ausführen. Ich fand tcollectorCodeHier. Auch in diesem Code folgen sie denselben Schritten wie in der Beschreibung von daemon(). Meine Frage ist also, warum sollten wir diese Schritte durchführen (in Bezug auf ).daemonize()in tcollector) wie

warum dirzu /, umaskzu ändern 022und dann aufrufen os.setsid()usw.

Antwort1

Da steht eigentlich mehr als das, was Sie zitiert haben, aber ich denke, die Manualpage könnte klarer sein.

Wenn nochdir Null ist, daemon()wird das aktuelle Arbeitsverzeichnis des Prozesses in das Stammverzeichnis geändert ( /)

Hier wird davon ausgegangen, dass das Programm von einer Administrator-Befehlszeile aus gestartet wird. Die Idee besteht darin, den Daemon von dem zu trennen, was der Administrator zu diesem Zeitpunkt tat. Durch Ändern des Arbeitsverzeichnisses in /wird verhindert, dass der Daemon einen Einhängepunkt beschäftigt hält. Wenn beispielsweise das Arbeitsverzeichnis in ist /home/adminund Sie einige Zeit später aushängen möchten /home, würde der Daemon dies verhindern.

Wenn noclose Null ist, daemon()werden Standardeingabe, Standardausgabe und Standardfehler umgeleitet an /dev/null;

Damit soll verhindert werden, dass der Daemon Benutzer verwirrt, indem er vereinzelte Fehlermeldungen oder Ähnliches auf ihr Terminal schreibt. Was der Daemon wahrscheinlich tun sollte, ist, eine (konfigurierte) Protokolldatei zu öffnen und dort alles zu schreiben, was er nach außen kommunizieren möchte.

(Diese Funktion verzweigt sich, und wenn fork(2) erfolgreich ist, ruft das übergeordnete Element _exit(2) auf, sodass weitere Fehler nur dem untergeordneten Element angezeigt werden.)

Um die Verbindung zur Shell-Sitzung des Administrators zu trennen, wird das Hauptprogramm sofort wieder aufgenommen und der andere Teil bleibt im Hintergrund. Sie müssen also nicht explizit darum bitten, das Programm im Hintergrund zu starten (z. B. ./daemon &).

Nun zu dem, was die Manualpage nicht explizit erklärt, hier aber impliziert (unter BUGS):

Die Implementierung dieser Funktion in der GNU C-Bibliothek wurde von BSD übernommen und verwendet nicht die Double-Fork-Technik (d. h. fork(2), setsid(2), fork(2)), die erforderlich ist, um sicherzustellen, dass der resultierende Daemon-Prozess kein Sitzungsleiter ist. Stattdessen ist der resultierende Daemon ein Sitzungsleiter.

daemon()ruft auchsetsid()sich aus der Sitzung zu lösenSteuerterminal, und daher von den Signalen, die vom Terminal gesendet werden. Aber wie das Zitat dort sagt, besteht die Möglichkeit, dass es, wenn es ein Terminalgerät öffnet, dieses versehentlich als steuerndes Terminal erhält. Um das zu vermeiden, rufen einige Programme auf fork(), dann setsid()vom Kind aus und verzweigen sich dann erneut, wobei beide Eltern beendet werden, sodass der resultierende Prozess kein Sitzungsleiter ist (der mittlere ist/war) und kein steuerndes Terminal erhalten kann. Das Python-Programm, auf das Sie sich beziehen, tut genau das.

Das Ändern umaskscheint nicht viel mit der Daemonisierung zu tun zu haben. Vielleicht hat dieses Programm einen besonderen Bedarf dafür.

verwandte Informationen