Z StackOverflow post'grep -q' neukončí s 'tail -f':
tail -fpřečte soubor a zobrazí řádky později přidané, neukončí se (pokud není signál jakoSIGTERMje poslán).grepzde není blokující část,tail -fje.grepbude číst z roury, dokud nebude uzavřena, ale nikdy tomu tak není, protožetail -fneukončí a ponechá potrubí otevřené.Řešením vašeho problému by pravděpodobně bylo (netestováno a velmi pravděpodobně bude fungovat špatně):
tail -f logfile | while read line; do echo $line | grep -q 'find me to quit' && break; done
Více informací a řešení najdete v odkazovaném příspěvku.
grep odejde a potrubí zmizí, ačkoli tail běží dál. Tento protokol hlášení o chybě začíná případem použití velmi podobným tomu vašemu:
Chci použít
tailagrepsledovat soubor, dokud se neobjeví konkrétní vzor. Aletailneukončí se, kdyžgrepje hotovo.$ echo xxx > /tmp/blabla $ tail -f /tmp/blabla |grep -m1 --line-buffered "xxx" xxxNyní
tailstále se pokouší číst a ukončí se pouze tehdy, když znovu zapíšu do/tmp/blabla.Je to tak, jak to má být?
Vysvětlení zde:
tailukončí se na SIGPIPE, ale dostane signál pouze nawrite(), a proto potřebujete získat více dat v souboru předtailukončí se.
Pokud vím, tento přesný mechanismus je velmi běžný. Mnoho nástrojů končí po snaží se něco napsat do prasklé trubky, není to chyba.
Pak přišlo toto přání:
Je pravda, že
tail, protože to může viset věčně, měl by podniknout speciální kroky, aby reagoval na to, že druhý konec potrubí zmizí.
A nakonec:
Implementováno v:
https://git.sv.gnu.org/cgit/coreutils.git/commit/?id=v8.27-42-gce0415f
A skutečně, když se pokusím reprodukovat váš problém s tail z GNU coreutils 8.28 nemohu. Nástroj se okamžitě ukončí.