lettura continua da named pipe (cat o tail -f)


16

Ho configurato rsyslogper registrare determinati eventi del registro per /dev/xconsole:

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

/dev/xconsoleè una pipe denominata ( fifo). Se voglio vedere cosa viene registrato, posso fare cat /dev/xconsole. Sono sorpreso di vedere che il comando cat /dev/xconsolenon termina dopo aver letto il file, ma agisce come tail -f. in altre parole, i due comandi si comportano allo stesso modo:

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

Qualcuno può spiegare perché?

C'è qualche differenza tra i due?

Risposte:


18

catcontinua a leggere fino a quando non ottiene EOF. Una pipe produce EOF sull'uscita solo quando ottiene EOF sull'ingresso. Il daemon di registrazione sta aprendo il file, scrivendolo e tenendolo aperto - proprio come fa per un file normale - quindi EOF non viene mai generato sull'output. catcontinua a leggere, bloccando ogni volta che esaurisce ciò che è attualmente nella pipe.

Puoi provarlo manualmente:

$ mkfifo test
$ cat test

E in un altro terminale:

$ cat > test
hello

Ci sarà uscita nell'altro terminale. Poi:

world

Ci sarà più output nell'altro terminale. Se ora premi Ctrl-D sull'input, anche l'altro catterminerà.

In questo caso, l'unica differenza osservabile tra cate tail -fsarà se il demone di registrazione è terminato o riavviato: catsi fermerà permanentemente quando viene chiusa la fine della scrittura della pipe, ma tail -fcontinuerà (riaprendo il file) quando il demone viene riavviato.


scusami non vedo da dove verrà "mondo" nel tuo esempio :)
Alexander Mills,

Dalla tua digitazione.
Michael Homer

1
E poi digiti world, e, lo, "world" appare nell'altro terminale.
Michael Homer,

2

C'è anche una differenza nel buffering tra cate tail -f. Puoi verificarlo:

Crea pipe: mkfifo pipe

Inizia a leggere la pipe usando catin background:cat pipe &

Apri pipe e scrivici ogni secondo: perl -MFcntl -we 'sysopen(my $fh, "pipe", O_WRONLY | O_NONBLOCK); while() {warn "written: " . syswrite($fh, "hello\n"); sleep 1}'

Ora prova questo tail -f pipe &invece di cat. Quindi puoi vedere che catstampa le linee non appena vengono scritte in pipe dallo script perl, mentre le tail -f bufferizza fino a 4kb prima di stampare su stdout.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.