adlandırılmış borudan sürekli okuma (kedi veya kuyruk -f)


16

rsyslogBelirli günlük olaylarını günlüğe kaydetmek için yapılandırıldım /dev/xconsole:

*.*;cron.!=info;mail.!=info      |/dev/xconsole

/dev/xconsoleadlı bir adlandırılmış kanaldır ( fifo). Nelerin günlüğe kaydedildiğini görmek istersem yapabilirim cat /dev/xconsole. cat /dev/xconsoleDosyayı okuduktan sonra komutun bitmediğini görmek yerine şaşırdım , bunun yerine işlev görür tail -f. diğer bir deyişle, iki komut aynı şekilde davranır:

cat /dev/xconsole
tail -f /dev/xconsole

Birisi bunun neden olduğunu açıklayabilir mi?

İkisi arasında herhangi bir fark var mı?

Yanıtlar:


18

catEOF alana kadar okumaya devam eder. Bir boru çıkışta sadece girişe EOF aldığında EOF üretir. Günlük arka plan programı dosyayı açıyor, yazıyor ve normal bir dosyada olduğu gibi açık tutuyor; böylece çıktıda EOF oluşturulmaz. catsadece okumaya devam ediyor, boruda ne varsa tükettiğinde engelliyor.

Bunu kendiniz manuel olarak deneyebilirsiniz:

$ mkfifo test
$ cat test

Ve başka bir terminalde:

$ cat > test
hello

Diğer terminalde çıkış olacak. Sonra:

world

Diğer terminalde daha fazla çıkış olacak . Şimdi girişi Ctrl-D yaparsanız, diğeri catde sonlandırılır.

Bu durumda, arasındaki tek gözlemlenebilir fark catve tail -f: günlük sunucu programı sonlandırılır veya yeniden başlatılırsa olacak cathattın sonuna yazma kapatıldığında kalıcı durdurur, ancak tail -fcin yeniden başlatıldığında gidiyor (dosyayı yeniden açmayı) korur.


"dünya" :) sizin örnekte nereden geleceği üzgün görmüyorum
Alexander Mills

Yazdığınız yerden.
Michael Homer

1
Sonra yazıyorsunuz worldve diğer terminalde "dünya" beliriyor.
Michael Homer

2

Bir fark vardır tamponlama arasında catve tail -f. Şuna bakabilirsiniz:

Boru oluştur: mkfifo pipe

catArka planda kullanarak boruyu okumaya başlayın :cat pipe &

Boruyu açın ve her saniye ona yazın: perl -MFcntl -we 'sysopen(my $fh, "pipe", O_WRONLY | O_NONBLOCK); while() {warn "written: " . syswrite($fh, "hello\n"); sleep 1}'

Şimdi tail -f pipe &bunun yerine ile deneyin cat. Böylece, catçizgileri perl betiği ile boruya yazılır tail -f yazmaz yazdırırken, stdout'a yazdırmadan önce bunları 4kb'ye kadar tamponlar.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.