J'ai configuré rsyslog
pour enregistrer certains événements de journal pour /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 le 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 à la place 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?
world
, et, lo, "world" apparaît dans l'autre terminal.Il existe également une différence de mise en mémoire tampon entre
cat
ettail -f
. Vous pouvez vérifier ceci:Créer un tuyau:
mkfifo pipe
Commencez à lire le tuyau en utilisant
cat
en arrière-plan:cat pipe &
Ouvrez le tuyau et écrivez-y toutes les secondes:
perl -MFcntl -we 'sysopen(my $fh, "pipe", O_WRONLY | O_NONBLOCK); while() {warn "written: " . syswrite($fh, "hello\n"); sleep 1}'
Essayez maintenant avec
tail -f pipe &
au lieu decat
. Vous pouvez donc voir que lescat
lignes sont imprimées dès qu'elles sont écrites dans le script pipe par perl, tout en lestail -f
tamponnant jusqu'à 4 Ko avant d'imprimer sur stdout.la source
cat
vous montre tout le fichier lorsquetail -f
Ne montre que les dernières lignes et suit. Donc, si le fichier est court, ils se comportent de la même manière, mais si le fichier est volumineux (100+ lignes), vous pouvez voir une nette différence entre les deux.Informations supplémentaires sur ces commandes:
tail
http://www.computerhope.com/unix/utail.htmcat
http://www.computerhope.com/unix/ucat.htmla source