Warum read -t
Zeitüberschreitung beim Ablesen aus der Leitung von RHEL5 oder RHEL6?
Hier ist mein Beispiel, das meine RHEL-Boxen beim Lesen aus der Pipe nicht überschreitet:
tail -f logfile.log | grep "something" | read -t 3 variable
Wenn ich richtig bin read -t 3
sollte nach 3 Sekunden Timeout?
Vielen Dank im Voraus.
Chris
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
Antworten:
2 für die Antwort № 1Obwohl es keine direkte Antwort auf Ihre spezifische Frage ist, müssen Sie so etwas ausführen
read -t 3 variable < <( tail -f logfile.log | grep "something" )
um den neu eingestellten Wert von variable
sichtbar sein, nachdem die Pipeline abgeschlossen ist. Sehen Sie, ob dies wie erwartet abläuft.
Da benutzt du einfach read
Um die Pipeline nach einer festgelegten Zeit zu verlassen, müssen Sie sich nicht um den Umfang von kümmern variable
. Jedoch, grep
kann eine Übereinstimmung finden, ohne sie innerhalb des Timeouts auszudrucken, da sie intern gepuffert ist. Sie können das deaktivieren (mit GNU grep
zumindest) mit der --line-buffered
Möglichkeit:
tail -f logfile.log | grep --line-buffered "something" | read -t 3
Eine andere Option, falls verfügbar, ist die timeout
Befehl als Ersatz für die read
:
timeout 3 tail -f logfile.log | grep -q --line-buffered "something"
Hier töten wir tail
nach 3 Sekunden und verwenden Sie den Beendigungsstatus von grep
wie üblich.
4 für die Antwort № 2
Die von chepner gegebene Lösung sollte funktionieren.
Eine Erklärung dafür, warum Ihre Version nicht einfach ist: Wenn Sie eine Pipe wie die Ihre erstellen, fließen die Daten von links nach rechts durch die Pipe read
Mal aus, laufen die Programme auf der linken Seite weiter, bis sie feststellen, dass die Pipe defekt ist. Dies geschieht nur, wenn sie versuchen, in die Pipe zu schreiben.
Ein einfaches Beispiel ist dies:
cat | sleep 5
Nach fünf Sekunden wird das Rohr da zerbrochen sleep
wird aussteigen, aber cat
läuft trotzdem weiter, bis Sie die Eingabetaste drücken.
In Ihrem Fall bedeutet dies, dass Ihr Befehl trotz des Timeouts weiter ausgeführt wird, bis grep ein Ergebnis liefert.
0 für die Antwort № 3
Ich habe derzeit keinen RHEL-Server, um Ihr Skript zu testen, aber ich könnte wetten, dass das Lesen beim Timeout beendet wird und wie es soll. Versuchen Sie es einmal:
grep "something" | strace bash -c "read -t 3 variable"
und du kannst das bestätigen.