Использование tail -n0 -f конвейера для grep действительно хорошее решение, и действительно, первый процесс в конвейере умрет, когда он попытается вывести в мертвый процесс grep.
Но если вы ищете текст, который появляется рядом с последним текущим выводом хвоста, то grep уже прочитает весь ввод из хвоста (в одном блоке), и поэтому в выводе больше не будет текста. log, который нужно отправить по каналу, так как grep уже прочитал его перед выходом (или, может быть, он уже был в буфере канала) - по крайней мере, я так понимаю.
Использование параметра «-m1» в grep выглядит так, как будто он сделает именно то, что вы хотите, и оставит ввод сразу после строки, с которой он совпал, но, похоже, это не имело значения и не помогло мне в поиске аналогичной функциональности. Я подозреваю, что буфер канала по-прежнему содержит весь вывод текста из хвоста или по какой-то другой причине, по которой у хвоста не осталось ничего для вывода. Вы хотели, чтобы этот текст post-grep-match все еще оставался для вывода следующим, потому что это убьет ваш хвост, когда он попытается (все еще рискованно - что произойдет, если по какой-то причине это последняя строка?), и вернет управление вызывающему сценарию. .
Я обнаружил, что один из способов — вывести что-либо в конец файла журнала после завершения работы grep; т.е.
хвост -f файл журнала | ( grep -q ; эхо >> файл журнала)
У меня есть теория о том, что (если мое предположение верно) вы можете заставить канал быть менее буферизованным, чтобы он работал без этого, или, может быть, добавление команды настройки huponexit к соответствующему компоненту канала, т.е. в (вероятно, фигурных) скобках помощь; но я не заботился о добавлении пустой строки в файл журнала, и он работал нормально, и это всего лишь меньший тестовый сценарий (так что это не долгоживущий файл журнала, который должен придерживаться формата для другой обработки).
shopt -s huponexit был бы полезен, если бы не подоболочка.
PS мой первый пост здесь, я хотел бы сделать это как комментарий к существующему ответу, а не повторять материал, но я не думаю, что могу сейчас.
person
Breezer
schedule
27.06.2011
read -t 30 line
будет ждать тридцать секунд после каждой прочитанной строки, а затем, если читать больше нечего, возвращает false (выход из петля) - person falstro   schedule 11.01.2010