Skip to content
iphone 3G S

Daemon mit dem kaufmännischen UND ( & )? cmd & = daemon ?

Ein Daemon ist ein Prozess der im Hintergrund läuft , somit unabhängig von der Shell ist . trotzdem “Anfragen” bearbeiten kann und dessen Parent Process der init-Prozess also PPID 1 ist. Unter Windows werden diese Prozesse Dienst / Service genannt.

Zitat aus Peter Mandl – Grundkurs Betriebssysteme Seite 101:
Die meisten Unix-Prozesse, deren Namen mit einem “d” enden, sind sog. Dämonprozesse. Dies sind Hintergrundprozesse, die beim Start vom Terminal abgekoppelt werden. Sie werden von der Unix-Shell aus gestartet, indem beim Start an den Namen des Prozesses das Zeichen “&” angehängt wird. Nur am Rande sei erwähnt, dass der Programmierer eines Programms, das als Daemonprozess ablaufen soll, bei der Initialisierung das Signal SIGHUP deaktivieren muss, damit der Prozess vom Terminal unabhängig wird.

Aus aktuellem Anlass stellte sich die Frage: Stimmt das? Wird aus jedem Programm ein Prozess wenn ich es mit einen & dahinter aufrufe?

Erster Versuch:
Test Programm:
#!/bin/bash
# testdemon - Test "Demon"
while [ true ] ; do
echo "ich bin noch da"
done

Natürlich noch ausführbar machen …..

ausführen:
kraut@HOME ~ $ ./testdemon &

Ergebnis:
1. Schließt man nun die Shell und bemüht man sich des ps Kommandos so wird man feststellen dass testdemon nicht mehr läuft, da dessen Parent Prozess (also die Shell) geschlossen wurde und testdemon anscheinend doch abhängig von der Shell ist . (mit ps -l | grep testdemon sieht man auch ohne die Shell zu beenden wie die PPID ist. hier !=1)
2. Es finden noch Ausgaben auf dem Terminal statt! Ist das ein Zeichen für eine Abhängigkeit vom Terminal?
3. Die Shell ist jedoch noch benutzbar: Lässt man sich von den vielen Ausgaben nicht irritieren und gibt einfach mal exit ein so wird die Shell / das Terminal beendet trotz der viel Ausgaben des testdemon.

Fest steht jedenfalls dass testdemon im Hintergrund läuft, sonst wäre der Terminal in dem es ausgeführt wird nicht mehr benutzbar.

Zweiter Versuch wie verhält sich das als Benutzer root:
ausführen:
HOME kraut # ./testdemon &
Nun öffne ich ein neuen Terminal (der alte bleibt offen!)und versuche herauszufinden welches der ParentProcess ist:
kraut@HOME ~ $ ps -l -u root | grep testdemon
0 R 0 6324 6310 63 80 0 - 630 - pts/1 00:00:06 undtest

Der vierte Wert bezeichnet die PID des Vater Prozesses also die PPID.

1. Also ist der Prozess mit PID 6310 der Vater von testdemon. Somit nicht init(PID=1).
2. Die Ausgabe kommt weiterhin aufs Terminal.
3. Terminal weiterhin beutzbar. Test mit exit

Nun schließe ich die Shell in der testdemon ausgeführt wird.
Such nach dem Vater:
kraut@HOME ~ $ ps -l -u root | grep testdemon
0 R 0 6324 1 64 80 0 - 631 - ? 00:00:10 undtest

JUHUUU init ist Vater, PPID = 1 !

Somit wird ein Programm das mit einem nachgestellen & aufgerufen wird nicht beendet wenn die Shell beendet wird,
sondern bekommt als “neuen” Vater Prozess den init Prozess.

Aber nur als root oder wie???
NEIN!
Als root wird das Signal SIGHUP anscheinend standardmäßig deaktiviert !?( eine Persönliche Vermutung)

Möchte man das gleiche Verhalten als “normaler” Benutzer so muss das Signal SIGHUB deaktiviert werden.
Dazu am Anfang des Skripts einfach ein trap “” 1 einfügen ( 1 steht für SIGHUP siehe: man trap).
Der testdemon würde dann so aussehen:

#!/bin/bash
# testdemon - Test "Demon"
trap "" 1
while [ true ] ; do
echo "ich bin noch da"
done


Somit schließe ich daraus:

Jedes Programm welches das Signal SIGHUP deaktiviert, kann mit nachgestelltem ‘&’ aus der Shell als Daemon gestartet werden. Als Benutzer root ist das explizite deaktivieren von SIGHUP nicht erforderlich um ein Programm als Daemon zu starten.

Jedoch wird der init Prozess erst wenn die Shell selbst stirbt zum Vaterprozess, ist es erst dann ein “echter Daemon”?

Wer kann mir helfen?


Mobile Navigation von NAVIGON

3 Kommentare

  1. Flo

    Schau dir mal den Befehl nohup.

    Vielleicht hilft dir das weiter.

    Posted on 23-Nov-08 at 5:30 pm | Permalink
  2. LnddMiles

    The best information i have found exactly here. Keep going Thank you

    Posted on 22-Jul-09 at 5:22 am | Permalink
  3. Der Befehl disown ist in diesem Zusammenhang auch interessant ;)

    Posted on 22-Jul-09 at 12:39 pm | Permalink

Eintrag kommentieren

Deine Email-Adresse wird weder veröffentlicht noch an Dritte weitergegeben.
Pflichtfelder sind markiert *
*
*