web-dev-qa-db-fra.com

lecture continue de tuyau nommé (chat ou queue -f)

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?

16
Martin Vegter

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é.

18
Michael Homer

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.

2
InterestedIn