Wednesday, December 22, 2010

Warten auf Standard-Ausgabe in Bash oder offene Pfeife

Das Problem

Nach Aufruf eines Dämons (hier sleep) kehrt die Bash nicht gleich zurück sondern wartet.
$  time ( sleep 3 &)|cat; ps

real    0m3.005s
user    0m0.000s
sys     0m0.004s
  PID TTY          TIME CMD
 7644 pts/0    00:00:00 bash
14552 pts/0    00:00:00 ps

Erklärung

Das "sleep" Kommando in der Subshell "( )" soll in den Hintergrund gehen "&". Danach soll die Ausgabe des symbolischen "sleep"-Dämons mit einem symbolischen "cat" verarbeitet werden. Die Zeitmessung "time" dauert statt der erwarteten 0.0x volle 3 Sekunden und "sleep" ist nach dem Aufruf nicht in der Prozessliste sichtbar.

Analyse

Das passiert nur, wenn die Ausgabe über eine Pfeife "|" geleitet wird. "cat" muss auf alle Eingaben warten, bevor es sich selbst schließt.

Workaround

$ time ( sleep 3 &)>/dev/null|cat; ps

real    0m0.003s
user    0m0.000s
sys     0m0.004s
  PID TTY          TIME CMD
 7644 pts/0    00:00:00 bash
17449 pts/0    00:00:00 sleep
17450 pts/0    00:00:00 ps
Hier wird die Standardausgabe auf /dev/null umgelenkt. Damit muss "cat" nicht mehr auf die Ausgabe warten. Ein definiertes Logging kann auch in eine Datei erfolgen, falls man die Ausgabe behalten möchte:
$ ( sleep 3 &)>/var/log/meindaemon.log|cat

Empfehlung

Ein "richtiger" Dämon sollte immer selbst Standardaus- und Eingaben abkoppeln um nicht noch gekoppelte Prozesse in der aufrufenden Shell aufzuhalten.

Tools zum Debuggen

  • lsof -p (PID) Offene Dateien eines Programmes auflisten
  • pfiles (PID) Schöner offene Dateien eines Programmes auflisten
  • fuser (Datei) Herausfinden, von welcher PID eine Datei geöffnet wird

No comments:

Post a Comment