J'ai configuré rsyslog
pour enregistrer certains événements de journal à /dev/xconsole
:
*.*;cron.!=info;mail.!=info |/dev/xconsole
/dev/xconsole
est un tuyau 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 finit pas après avoir lu le 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 s'il vous plaît expliquer pourquoi cela?
Y a-t-il une différence entre les deux?
cat
continue à lire jusqu'à ce qu'il devienne EOF. Un tuyau produit EOF sur la sortie uniquement lorsqu'il obtient =EOF sur l'entrée. Le démon journal ouvre le fichier, l'écriture, et le garder ouvert - Tout comme il le fait pour un fichier régulier - donc EOF n'est jamais généré sur la sortie. cat
_ Il suffit de lire, de bloquer chaque fois qu'il actuellement dans la pipe.
Vous pouvez essayer cela pour vous-même manuellement:
$ mkfifo test
$ cat test
Et dans un autre terminal:
$ cat > test
hello
Il y aura une sortie dans l'autre terminal. Puis:
world
Il y aura plus sortie dans l'autre terminal. Si vous êtes maintenant ctrl-d l'entrée, l'autre cat
prendra également fin.
Dans ce cas, la seule différence observable entre cat
et tail -f
sera si le démon de journalisation est terminé ou redémarré: cat
_ _ _ va arrêter de manière permanente lorsque l'extrémité d'écriture du tuyau est fermée, mais tail -f
continuera à aller (rouvrir le fichier) lorsque le démon est redémarré.
Il y a aussi une différence de tampon entre cat
et tail -f
. Vous pouvez vérifier cela:
Créer un tuyau: mkfifo pipe
Démarrez le tuyau de lecture en utilisant cat
en arrière-plan: cat pipe &
Tuyau ouvert et écrivez-le chaque seconde: Perl -MFcntl -we 'sysopen(my $fh, "pipe", O_WRONLY | O_NONBLOCK); while() {warn "written: " . syswrite($fh, "hello\n"); sleep 1}'
Maintenant, essayez ceci avec tail -f pipe &
Au lieu de cat
. Vous pouvez donc voir que cat
imprime des lignes dès qu'ils sont écrits sur Tuyau par le script Perl, tandis que tail -f
Les tampons jusqu'à 4 kb avant d'imprimer sur STDOUT.