Da StackOverflow post'grep -q' non esce con 'tail -f':
tail -fleggerà un file e visualizzerà le righe aggiunte successivamente, non si interromperà (a meno che non venga visualizzato un segnale comeSIGTERMè inviato).grepnon è la parte bloccante qui,tail -fè.grepleggerà dalla pipe finché non sarà chiusa, ma non lo sarà mai perchétail -fnon si chiude e mantiene aperta la pipa.Una soluzione al tuo problema sarebbe probabilmente (non testata e molto probabile che funzioni male):
tail -f logfile | while read line; do echo $line | grep -q 'find me to quit' && break; done
Troverai maggiori informazioni e soluzioni nel post collegato.
grep esce e la pipe va via, anche se tail continua a correre. Questo registro delle segnalazioni di bug inizia con un caso d'uso molto simile al tuo:
Voglio usare
tailegrepseguire un file fino a quando appare un modello particolare. Matailnon esce quandogrepè finito.$ echo xxx > /tmp/blabla $ tail -f /tmp/blabla |grep -m1 --line-buffered "xxx" xxxOra
tailprova ancora a leggere ed esce solo se scrivo di nuovo in/tmp/blabla.È così che dovrebbe essere?
La spiegazione qui:
tailesce su SIGPIPE, tuttavia otterrà il segnale solo suwrite(), quindi devi ottenere più dati nel file prima ditailuscirà.
Per quanto ne so, questo meccanismo esatto è molto comune. Molti strumenti escono dopo provano a scrivere qualcosa su un tubo rotto, non è un bug.
Poi è arrivato questo desiderio:
È giusto però che
tail, dal momento che può rimanere in giro per sempre, dovrebbe adottare misure speciali per rispondere all'allontanamento dell'altra estremità del tubo.
E infine:
Implementato in:
https://git.sv.gnu.org/cgit/coreutils.git/commit/?id=v8.27-42-gce0415f
E infatti, quando provo a riprodurre il tuo problema con tail da GNU coreutils 8.28, non posso. Lo strumento esce immediatamente.