Ich habe konfiguriert rsyslog
, um bestimmte Protokollereignisse zu protokollieren /dev/xconsole
:
*.*;cron.!=info;mail.!=info |/dev/xconsole
/dev/xconsole
ist eine Named Pipe ( fifo
). Wenn ich sehen möchte, was protokolliert wird, kann ich das tun cat /dev/xconsole
. Ich bin überrascht zu sehen, dass der Befehl cat /dev/xconsole
nach dem Lesen der Datei nicht beendet wird, sondern wie folgt funktioniert tail -f
. Mit anderen Worten, die beiden Befehle verhalten sich gleich:
cat /dev/xconsole
tail -f /dev/xconsole
Kann mir bitte jemand erklären, warum das so ist?
Gibt es einen Unterschied zwischen den beiden?
world
, und siehe, "world" erscheint im anderen Terminal.Es gibt auch einen Unterschied in der Pufferung zwischen
cat
undtail -f
. Sie können dies überprüfen:Pipe erstellen:
mkfifo pipe
Beginnen Sie mit dem Lesen der Pipe
cat
im Hintergrund:cat pipe &
Öffne die Pipe und schreibe jede Sekunde darauf:
perl -MFcntl -we 'sysopen(my $fh, "pipe", O_WRONLY | O_NONBLOCK); while() {warn "written: " . syswrite($fh, "hello\n"); sleep 1}'
Versuchen Sie dies jetzt mit
tail -f pipe &
anstelle voncat
. Sie können also sehen, dasscat
Zeilen gedruckt werden, sobald sie per Perl-Skript in die Pipe geschrieben wurden, währendtail -f
sie vor dem Drucken auf stdout auf 4 KB gepuffert werden.quelle
cat
Zeigt Ihnen die gesamte Datei an, wenntail -f
Zeigt nur die letzten Zeilen an und folgt. Wenn die Datei also kurz ist, verhalten sie sich gleich, aber wenn die Datei groß ist (über 100 Zeilen), können Sie einen deutlichen Unterschied zwischen beiden feststellen.Zusätzliche Informationen zu diesen Befehlen:
tail
http://www.computerhope.com/unix/utail.htmcat
http://www.computerhope.com/unix/ucat.htmquelle