Почему `read -t` не работает в Bash на RHEL?

Зачем read -t не истекает время ожидания при чтении из канала на RHEL5 или RHEL6?

Вот мой пример, который не прерывает чтение RHEL-ящиков из канала:

tail -f logfile.log | grep 'something' | read -t 3 variable

Если я прав read -t 3 должен тайм-аут через 3 секунды?

Спасибо заранее.

Крис

GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)

3 ответа

Решение

Хотя это не прямой ответ на ваш конкретный вопрос, вам нужно будет выполнить что-то вроде

read -t 3 variable < <( tail -f logfile.log | grep "something" )

для того, чтобы вновь установить значение variable быть видимым после завершения конвейера. Посмотрим, выйдет ли это, как ожидалось.


Поскольку вы просто используете read как способ выхода из конвейера через определенное время, вам не нужно беспокоиться о масштабах variable, Тем не мение, grep может найти совпадение, не печатая его в течение вашего тайм-аута из-за собственной внутренней буферизации. Вы можете отключить это (с GNU grepпо крайней мере), используя --line-buffered опция:

tail -f logfile.log | grep --line-buffered "something" | read -t 3

Другой вариант, если таковой имеется, это timeout команда в качестве замены для read:

timeout 3 tail -f logfile.log | grep -q --line-buffered "something"

Здесь мы убиваем tail через 3 секунды и используйте статус выхода grep обычным способом.

Решение, данное chepner, должно работать.

Объяснение, почему ваша версия не так проста: когда вы создаете канал, как у вас, данные проходят через канал слева направо. Когда ваш read Однако время ожидания программы на левой стороне продолжат работать, пока они не заметят, что канал сломан, и это происходит только при попытке записи в канал.

Простой пример:

cat | sleep 5

Через пять секунд труба будет сломана, потому что sleep выйдет, но cat тем не менее будет продолжать работать, пока вы не нажмете возврат.

В вашем случае это означает, что пока grep не выдаст результат, ваша команда продолжит работать, несмотря на тайм-аут.

У меня нет RHEL-сервера для тестирования вашего сценария прямо сейчас, но я могу поспорить, что чтение завершается по тайм-ауту и ​​работает как надо. Попробуйте запустить:

grep 'something' | strace bash -c "read -t 3 variable"

и вы можете это подтвердить.

Другие вопросы по тегам