Comment fonctionne le paramètre "-f" de la commande "tail"?

59
$ tail -f testfile

la commande est censée afficher les dernières entrées du fichier spécifié, en temps réel, non? Mais ce n'est pas le cas. Corrigez-moi s'il vous plaît, si ce que je compte faire est faux ...

J'ai créé un nouveau fichier "aaa" et ajouté une ligne de texte et l'a fermé. puis a émis cette commande (première ligne):

$ tail -f aaa
xxx
xxa
axx

les trois dernières lignes représentent le contenu du fichier aaa. Maintenant que la commande est toujours en cours d'exécution (depuis que je l'utilise -f), j'ai ouvert le fichier aaa via l'interface graphique et commencé à ajouter quelques lignes supplémentaires manuellement. Mais le terminal ne montre pas les nouvelles lignes ajoutées dans le fichier.

Quel est le problème ici? La tail -fcommande affiche uniquement les nouvelles entrées si elles sont écrites par le système uniquement? (comme les fichiers journaux, etc.)

c'est moi
la source

Réponses:

62

De la tail(1) page de manuel :

   With  --follow  (-f),  tail  defaults to following the file descriptor,
   which means that even if a tail’ed file is renamed, tail will  continue
   to  track  its  end.   This  default behavior is not desirable when you
   really want to track the actual name of the file, not the file descrip-
   tor (e.g., log rotation).  Use --follow=name in that case.  That causes
   tail to track the named file  in  a  way  that  accommodates  renaming,
   removal and creation.

Votre éditeur de texte renomme ou supprime le fichier d'origine et enregistre le nouveau fichier sous le même nom de fichier. Utilisez à la -Fplace.

Ignacio Vazquez-Abrams
la source
travaillé! Donc, je peux utiliser la $ tail -F filenamecommande tout le temps au lieu de $ tail -f filenamebien?
its_me
17
Si c'est votre comportement souhaité. Il peut y avoir des cas où vous souhaitez suivre un descripteur au lieu d'un nom de fichier, mais pour être juste, je n'en ai pas rencontré beaucoup.
Ignacio Vazquez-Abrams
lsofpeut montrer ce qui se passe - par exemple lsof -Fpcftnimontrerait que l'inode suivi par tailn'est plus le même que celui que l'éditeur a ouvert.
Aaron D. Marasco
10

Votre éditeur a son propre tampon pour le fichier. Lorsque vous modifiez le texte dans l'éditeur, rien n'est écrit dans le fichier lui-même.

Lorsque vous enregistrez vos modifications, il est probable que l'éditeur supprime simplement l'ancien fichier et en crée un nouveau. tail -fsera toujours connecté au fichier supprimé, ainsi il ne montrera rien de nouveau.

Stéphane Gimenez
la source
1
L'éditeur écrase le fichier, les journaux ajoutent le texte. C'est peut-être le problème.
Rufo El Magufo
@Juan: Je ne comprends pas votre commentaire. "écraser" n'a pas de signification concrète, à l'exception de celle que j'ai décrite dans ma réponse.
Stéphane Gimenez
Oui, je voulais dire la même chose que toi :)
Rufo El Magufo Le
3

tail "rafraichir" chaque 1 seconde par défaut, pas en temps réel.

Essayez avec ceci (vous avez besoin de bash4):

  • Ouvrez 2 terminaux.
  • Dans le premier terminal, exécutez touch ~/output.txtet tail -f ~/output.txt.
  • Dans le second terminal exécuter for i in {0..100}; do sleep 2; echo $i >> ~/output.txt ; done
  • Regardez la sortie de queue dans le premier terminal.
Rufo El Magufo
la source
Vouliez-vous dire echo $i >> ~/output.txt? En outre, cette réponse manque le but de la question.
Ignacio Vazquez-Abrams
1
Oui, j'ai corrigé le problème pendant que vous écriviez le commentaire :). Ma réponse est seulement un test pour le problème La commande tail -f ne montre les nouvelles entrées que si elles sont écrites par le système seulement?
Rufo El Magufo
4
@Juan: De nos jours, sur Linux, tailfa une implémentation basée sur inotify. Donc, il va actualiser en temps réel.
Stéphane Gimenez
Oui pour tailf, mais tailutilise inotify ?. Je ne savais pas tailf. La page de manuel de tail affiche la valeur par défaut de 1 seconde pour -s.
Rufo El Magufo
3
Oui, tailsuivi et utilise maintenant inotify aussi lorsque disponible. tailfn’interroge pas du tout, mais dort, quand il n’ya aucune activité sur le fichier. tail -fmontre de l'activité (voir la stracesortie).
Stéphane Gimenez