Z StackOverflow post'grep -q' neukončí s 'tail -f':
tail -f
přečte soubor a zobrazí řádky později přidané, neukončí se (pokud není signál jakoSIGTERM
je poslán).grep
zde není blokující část,tail -f
je.grep
bude číst z roury, dokud nebude uzavřena, ale nikdy tomu tak není, protožetail -f
neukončí 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
tail
agrep
sledovat soubor, dokud se neobjeví konkrétní vzor. Aletail
neukončí se, kdyžgrep
je hotovo.$ echo xxx > /tmp/blabla $ tail -f /tmp/blabla |grep -m1 --line-buffered "xxx" xxx
Nyní
tail
stá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:
tail
ukončí se na SIGPIPE, ale dostane signál pouze nawrite()
, a proto potřebujete získat více dat v souboru předtail
ukončí 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čí.