GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum ist `tail -f … | grep -q …` beenden, wenn es eine Übereinstimmung findet?

Von StackOverflow post'grep -q' wird nicht mit 'tail -f' beendet:

tail -f eine Datei liest und später hinzugefügte Zeilen anzeigt, wird es nicht beendet (es sei denn, ein Signal wie SIGTERM gesendet wird). grep ist hier nicht der blockierende Teil, tail -f ist. grep wird aus der Pipe lesen, bis sie geschlossen ist, aber das ist es nie, weil tail -f beendet nicht und hält die Pipe offen.

Eine Lösung für Ihr Problem wäre wahrscheinlich (nicht getestet und sehr wahrscheinlich schlecht):

tail -f logfile | while read line; do
  echo $line | grep -q 'find me to quit' && break;
done

Weitere Informationen und Lösungen finden Sie im verlinkten Beitrag.


grep wird beendet und die Pipe verschwindet, obwohl tail läuft weiter. Dieses Fehlerberichtsprotokoll beginnt mit einem Anwendungsfall, der Ihrem sehr ähnlich ist:

Ich möchte tail verwenden und grep einer Datei zu folgen, bis ein bestimmtes Muster erscheint. Aber tail wird nicht beendet, wenn grep ist fertig.

$ echo xxx > /tmp/blabla
$ tail -f /tmp/blabla |grep -m1 --line-buffered "xxx"
xxx

Jetzt tail versucht immer noch zu lesen und beendet sich nur, wenn ich erneut in /tmp/blabla schreibe .

Soll das so sein?

Die Erklärung dort:

tail beendet sich auf SIGPIPE, bekommt aber nur das Signal auf write() , und daher müssen Sie vor tail mehr Daten in die Datei bekommen wird beendet.

Soweit ich weiß, ist genau dieser Mechanismus sehr verbreitet. Viele Tools werden nach beendet Sie versuchen, etwas in eine kaputte Pipe zu schreiben, es ist kein Fehler.

Dann kam dieser Wunsch:

Es ist jedoch ein fairer Punkt, dass tail , da es ewig herumhängen kann, sollten spezielle Maßnahmen ergriffen werden, um auf das Weggehen des anderen Endes der Röhre zu reagieren.

Und schließlich:

Implementiert in:
https://git.sv.gnu.org/cgit/coreutils.git/commit/?id=v8.27-42-gce0415f

Und zwar, wenn ich versuche, Ihr Problem mit tail zu reproduzieren von GNU Coreutils 8.28 kann ich nicht. Das Tool wird sofort beendet.


Linux
  1. Wie führe ich Grep mit mehreren und Mustern aus?

  2. Mehrzeiliger Musterabgleich mit Sed, Awk oder Grep?

  3. Warum könnte man ~/.profile zu ~/.bash_profile hinzufügen?

  4. Grep und Schwanz -f?

  5. Grep -e, Sed -e – Geringe Leistung bei Verwendung von „[x]{1,9999}“, aber warum?

Warum Exit-Code 141 mit grep -q?

Warum kann ich Jiffies nicht der Betriebszeit zuordnen?

Warum UASP nicht verwendet wird

Warum LXC, wenn es einen Linux-vserver gibt?

Wie wendet man einen Filter auf die Echtzeitausgabe von `tail -f ` an?

Farbende von Apache-Protokollen