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 commeSIGTERM
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 quetail -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
etgrep
suivre un fichier jusqu'à ce qu'un motif particulier apparaisse. Maistail
ne sort pas lorsquegrep
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 surwrite()
, et vous devez donc obtenir plus de données dans le fichier avanttail
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.