GNU/Linux >> Znalost Linux >  >> Linux

Proč není `tail -f … | grep -q …` ukončí se, když najde shodu?

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 jako SIGTERM 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že tail -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 a grep sledovat soubor, dokud se neobjeví konkrétní vzor. Ale tail 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 na write() , a proto potřebujete získat více dat v souboru před tail 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čí.


Linux
  1. Jak spustit Grep s více a vzory?

  2. Shoda víceřádkového vzoru pomocí Sed, Awk nebo Grep?

  3. Grep pomalu končí po nalezení shody?

  1. Proč se [a-z] shoduje s malými písmeny v bash?

  2. Proč by se dalo přidat ~/.profile do ~/.bash_profile?

  3. Kdy a proč bych měl používat Apt-get Update?

  1. Proč mi Grep -o -w neposkytuje očekávaný výkon na Mac OS X?

  2. Proč Xargs nemůže pracovat s Tail -f?

  3. Proč se při použití uvozovek zobrazuje jedno zpětné lomítko?