Christian Seiler: PERL und Linux

Beitrag lesen

Hallo Bio,

Man laesst das Skript sich selbst von seinem Terminal abkoppeln, indem man das Skirpt forken laesst;
Der Parent macht ein exit (und ist beendet), das Child ruft die Funktion setsid() (gehoert zum POSIX Package, perldoc POSIX).
Daraufhin ist das Skript vom Terminal abgekoppelt und laeuft als Hintergrundprozess.

Naja, Du vereinfachst aber gewaltig.

Mit fork erzeugst Du eine exakte Kopie des aktuellen Prozesses. Die Ausführung in _beiden_ Prozessen geht genau nach dem fork()-Aufruf weiter. Das Programm kann nun an Hand des Rückgabewertes von fork() unterscheiden, ob es das Kind (d.h. die Kopie) oder der Elternprozess ist. Wenn fork() einen positiven Wert zurückgibt, dann befindet sich das Programm im Elternprozess und dieser positive Wert ist die Prozess-ID (pid) des Kindprozesses. Wenn fork() 0 zurückgibt, dann befindet sich das Programm im Kindprozess. Wenn fork() -1 zurückgibt, dann ist ein Fehler aufgetreten, der in der globalen Variable errno zu finden ist.

Die Ausführung geht genau dann von einem Prozess an die Shell zurück, wenn der aufgerufene Prozess beendet wird. Wenn dieser Prozess in der Zwischenzeit ein Kindprozess erzeugt hat, dann läuft der Kindprozess weiter und die Ausführung geht an die Shell zurück. Daher kann sich der Elternprozess beenden; der Kindprozess und die Shell laufen in dem Fall weiter. Der Kindprozess ist dann allerdings immernoch Mitglied der Session und besitzt immernoch einen Kontrollterminal.

Mit dem setsid()-Aufruf eröffnest Du für den aktuellen Prozess (nur noch der Kindprozess wird zu diesem Zeitpunkt ausgeführt!) eine neue Session und eine neue Prozessgruppe. Von beiden "Dingen" wird der Prozess nun "Oberhaupt". Außerdem besitzt der Prozess nach dem setsid()-Aufruf kein Kontrollterminal mehr.

Damit ein Dämon nicht einfach in irgendeinem Verzeichnis aufgerufen wird und dieses Verzeichnis später nicht mehr mit umount ausgehängt werden kann, sollte der Dämon nun in das Verzeichnis / oder ein Verzeichnis, auf das der Dämon zur Ausführung zwangsläufig Zugriff braucht, wechseln. (ein Dämon für Mailverkehr wird z.B. in das Verzeichnis mit den Mailboxen wechseln, sofern ein einheitliches derartiges Verzeihnis existiert) Falls ein Dämon nämlich z.B. unterhalb von /mnt/floppy/ aufgerufen wird (weil der Systemadministrator sich gerade in dem Verzeichnis befindet, wenn er den Dämon aufruft) dann kann /mnt/floppy nicht mehr ausgehängt werden, ohne dass der Dämon beendet wird.

Alle Dateideskriptoren, die nicht mehr benötigt werden, sollten geschlossen werden. (stdin, stdout, stderr) Wichtig: Kein Kontrollterminal heißt *nicht*, dass der Prozess nun nicht mehr auf das Terminal schreiben darf! Kontrollterminal ist ein etwas "anderes" Konzept. (das den Rahmen dieses Postings sprengen würde)

Empfehlenswert ist eventuell auch, die Dateikreierungsmaske per umask()-Aufruf auf 0 zu setzen, damit neu erstellte Dateien auch die Rechte erhalten, die der Dämon setzen will.

Viele Grüße,
Christian

--
Glaube niemals dem Gelabber der Forums-Antworten. Das sind doch Minderheiten-Diskriminierer, Sexisten, Psychisch Kranke und Depressive.
Ja auch Rassisten und ähnliche Sozialrowdies befinden sich da drunter. - </archiv/2003/8/54855/#m305505>