/ / Warum wird bei RHEL mit `read -t 'kein Zeitlimit überschritten? - Linux, Bash, Rhel5

Warum läuft 'read -t' nicht in bash auf RHEL? - Linux, Bash, Rhel5

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 № 1

Obwohl 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 grepzumindest) 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.