GNU/Linux >> Tutoriels Linux >  >> Linux

Pourquoi `tail -f n'est-il pas … | grep -q …` quittant lorsqu'il trouve une correspondance ?

De StackOverflow post'grep -q' ne sort pas avec 'tail -f' :

tail -f lira un fichier et affichera les lignes ajoutées ultérieurement, il ne se terminera pas (sauf si un signal comme SIGTERM est envoyé). grep n'est pas la partie bloquante ici, tail -f est. grep lira à partir du tube jusqu'à ce qu'il soit fermé, mais ce n'est jamais parce que tail -f ne quitte pas et garde le tuyau ouvert.

Une solution à votre problème serait probablement (non testé et très susceptible de mal fonctionner) :

tail -f logfile | while read line; do
  echo $line | grep -q 'find me to quit' && break;
done

Vous trouverez plus d'informations et de solutions dans l'article lié.


grep sort et le tuyau s'en va, bien que tail continue de courir. Ce journal de rapport de bogue commence par un cas d'utilisation très similaire au vôtre :

Je veux utiliser tail et grep suivre un fichier jusqu'à ce qu'un motif particulier apparaisse. Mais tail ne sort pas lorsque grep est terminé.

$ echo xxx > /tmp/blabla
$ tail -f /tmp/blabla |grep -m1 --line-buffered "xxx"
xxx

Maintenant tail essaie toujours de lire et quitte uniquement si j'écris à nouveau dans /tmp/blabla .

C'est censé être comme ça ?

L'explication ici :

tail sort sur SIGPIPE, mais il n'obtiendra le signal que sur write() , et vous devez donc obtenir plus de données dans le fichier avant tail va sortir.

Autant que je sache, ce mécanisme exact est très courant. De nombreux outils quittent après ils essaient d'écrire quelque chose sur un tuyau cassé, ce n'est pas un bug.

Puis ce souhait est venu :

C'est un bon point cependant que tail , puisqu'il peut traîner indéfiniment, devrait prendre des mesures spéciales pour réagir au départ de l'autre extrémité du tuyau.

Et enfin :

Mis en œuvre dans :
https://git.sv.gnu.org/cgit/coreutils.git/commit/?id=v8.27-42-gce0415f

Et effectivement, quand j'essaye de reproduire ton problème avec tail de GNU coreutils 8.28, je ne peux pas. L'outil se ferme immédiatement.


Linux
  1. Comment exécuter Grep avec plusieurs et modèles ?

  2. Correspondance de modèle multiligne à l'aide de Sed, Awk ou Grep ?

  3. Grep est-il lent à sortir après avoir trouvé une correspondance ?

  4. Pourquoi [a-z] correspond-il aux lettres minuscules dans Bash ?

  5. Quand et pourquoi devrais-je utiliser Apt-get Update ?

Grep -e, Sed -e - Faibles performances lorsque '[x]{1,9999}' est utilisé, mais pourquoi ?

`tail -f` ne suivra-t-il pas le Syslog lors de l'exécution en direct ?

pourquoi ne puis-je pas faire correspondre les jiffies à la disponibilité ?

Pourquoi UASP n'est pas utilisé

Comment appliquer un filtre à la sortie en temps réel de `tail -f ` ?

Queue de couleur des journaux Apache