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.