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