Почему `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"
и вы можете это подтвердить.