Ho configurato rsyslog
per registrare determinati eventi di registro su /dev/xconsole
:
*.*;cron.!=info;mail.!=info |/dev/xconsole
/dev/xconsole
è una named pipe (fifo
). Se voglio vedere cosa viene registrato, posso fare cat /dev/xconsole
. Sono sorpreso di vedere che il comando cat /dev/xconsole
non termina dopo aver letto il file, ma agisce invece 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é è così?
C'è qualche differenza tra i due?
Risposta accettata:
cat
continua a leggere finché non ottiene EOF. Una pipe produce EOF sull'output solo quando ottiene EOF sull'input. Il demone di registrazione sta aprendo il file, scrivendo su di esso, e mantenendolo aperto — proprio come fa per un file normale — quindi EOF non viene mai generato sull'output. cat
continua a leggere, bloccandosi ogni volta che esaurisce ciò che è attualmente nel tubo.
Puoi provarlo tu stesso manualmente:
$ mkfifo test
$ cat test
E in un altro terminale:
$ cat > test
hello
Ci sarà output nell'altro terminale. Quindi:
world
Ce ne saranno di più uscita nell'altro terminale. Se ora premi Ctrl-D l'input, poi l'altro cat
terminerà anche lui.
In questo caso, l'unica differenza osservabile tra cat
e tail -f
sarà se il demone di registrazione viene terminato o riavviato:cat
si fermerà in modo permanente quando l'estremità di scrittura della pipe è chiusa, ma tail -f
continuerà (riaprendo il file) al riavvio del demone.