In meinem Fall (bei RHEL wollte ich tail -n 0 -f file | grep -m 1 pattern
sofort beenden, wenn ein Muster in der wachsenden Datei auftritt), konnte die einfache Verwendung des Unbuffer- Dienstprogramms aus dem Expect-Paket das Problem aus irgendeinem Grund nicht lösen.
Aber basierend auf einem Blogbeitrag ( http://www.smop.co.uk/blog/index.php/2006/06/26/tail-f-and-awk/ ) habe ich entdeckt, dass die Weiterleitung von Eingaben vom Endstück gestartet wurde in einer subshell hat der trick:
grep -m 1 pattern <(tail -n 0 -f file)
Dies war jedoch nicht so einfach. Bei der Arbeit in einer interaktiven Shell blieb derselbe Befehl bei der Remote-Ausführung mit SSH wie üblich stehen:
ssh login@hostname 'grep -m 1 pattern <(tail -n 0 -f file)'
Ich habe entdeckt, dass man in diesem Fall die Ausgabe des Endes mit Hilfe des Unbuffer- Dienstprogramms von Expect aufheben muss:
ssh login@hostname 'grep -m 1 pattern <(unbuffer -p tail -n 0 -f file)'
Dies darf nicht auf einer interaktiven Shell verwendet werden - Unbuffer verursacht ein ioctl(raw): I/O error
!
Der Ratschlag für Sie lautet daher: Wenn die vorgeschlagenen Lösungen nicht funktionieren, versuchen Sie, tail -f
in einer Subshell zu starten, und wenn Sie dies in einem Skript oder in einer nicht interaktiven Shell tun möchten, verwenden Sie unbuffer
oder unbuffer -p
möglicherweise erforderlich.
Übrigens, in diesem Artikel finden Sie eine ausführliche Erklärung des Ausgabepufferproblems: http://www.pixelbeat.org/programming/stdio_buffering/