De StackOverflow post'grep -q' ne sort pas avec 'tail -f' :
tail -flira un fichier et affichera les lignes ajoutées ultérieurement, il ne se terminera pas (sauf si un signal commeSIGTERMest envoyé).grepn'est pas la partie bloquante ici,tail -fest.greplira à partir du tube jusqu'à ce qu'il soit fermé, mais ce n'est jamais parce quetail -fne 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
tailetgrepsuivre un fichier jusqu'à ce qu'un motif particulier apparaisse. Maistailne sort pas lorsquegrepest terminé.$ echo xxx > /tmp/blabla $ tail -f /tmp/blabla |grep -m1 --line-buffered "xxx" xxxMaintenant
tailessaie toujours de lire et quitte uniquement si j'écris à nouveau dans/tmp/blabla.C'est censé être comme ça ?
L'explication ici :
tailsort sur SIGPIPE, mais il n'obtiendra le signal que surwrite(), et vous devez donc obtenir plus de données dans le fichier avanttailva 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.