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.