Ich habe rsyslog
konfiguriert um bestimmte Protokollereignisse in /dev/xconsole
zu protokollieren :
*.*;cron.!=info;mail.!=info |/dev/xconsole
/dev/xconsole
ist eine benannte Pipe (fifo
). Wenn ich sehen möchte, was protokolliert wird, kann ich cat /dev/xconsole
ausführen . Ich bin überrascht zu sehen, dass der Befehl cat /dev/xconsole
wird nach dem Lesen der Datei nicht beendet, sondern fungiert stattdessen als tail -f
. mit anderen Worten, die beiden Befehle verhalten sich gleich:
cat /dev/xconsole
tail -f /dev/xconsole
Kann bitte jemand erklären, warum das so ist?
Gibt es einen Unterschied zwischen den beiden?
Akzeptierte Antwort:
cat
liest weiter, bis es EOF erhält. Eine Pipe erzeugt am Ausgang nur dann EOF, wenn sie am Eingang EOF erhält. Der Logging-Daemon öffnet die Datei, schreibt hinein und und hält sie geöffnet – genau wie bei einer normalen Datei –, sodass EOF niemals in der Ausgabe generiert wird. cat
liest einfach weiter und blockiert, wann immer es erschöpft ist, was sich gerade in der Leitung befindet.
Sie können dies selbst manuell ausprobieren:
$ mkfifo test
$ cat test
Und in einem anderen Terminal:
$ cat > test
hello
Es wird im anderen Terminal ausgegeben. Dann:
world
Es wird mehr geben Ausgabe im anderen Terminal. Wenn Sie jetzt Strg-D eingeben, dann die andere cat
wird auch beendet.
In diesem Fall ist der einzige beobachtbare Unterschied zwischen cat
und tail -f
wird sein, wenn der Logging-Daemon beendet oder neu gestartet wird:cat
stoppt dauerhaft, wenn das Schreibende der Pipe geschlossen wird, aber tail -f
wird weitermachen (die Datei erneut öffnen), wenn der Daemon neu gestartet wird.