J'ai configuré rsyslog
pour consigner certains événements du journal dans /dev/xconsole
:
*.*;cron.!=info;mail.!=info |/dev/xconsole
/dev/xconsole
est un tube nommé (fifo
). Si je veux voir ce qui est enregistré, je peux faire cat /dev/xconsole
. Je suis surpris de voir que la commande cat /dev/xconsole
ne se termine pas après la lecture du fichier, mais agit plutôt comme tail -f
. en d'autres termes, les deux commandes se comportent de la même manière :
cat /dev/xconsole
tail -f /dev/xconsole
Quelqu'un peut-il expliquer pourquoi ?
Y a-t-il une différence entre les deux ?
Réponse acceptée :
cat
continue de lire jusqu'à ce qu'il obtienne EOF. Un tube produit EOF sur la sortie uniquement lorsqu'il obtient EOF sur l'entrée. Le démon de journalisation ouvre le fichier, y écrit, et le garde ouvert - tout comme pour un fichier normal - donc EOF n'est jamais généré sur la sortie. cat
continue juste à lire, bloquant chaque fois qu'il épuise ce qui est actuellement dans le tuyau.
Vous pouvez essayer vous-même manuellement :
$ mkfifo test
$ cat test
Et dans un autre terminal :
$ cat > test
hello
Il y aura sortie dans l'autre terminal. Ensuite :
world
Il y en aura plus sortie dans l'autre terminal. Si vous maintenant Ctrl-D l'entrée puis l'autre cat
se terminera également.
Dans ce cas, la seule différence observable entre cat
et tail -f
sera si le démon de journalisation est arrêté ou redémarré :cat
s'arrêtera définitivement lorsque l'extrémité d'écriture du tube sera fermée, mais tail -f
continuera (réouverture du fichier) lorsque le démon sera redémarré.