Использование tail -n0 -f, переданного по каналу grep, действительно является хорошим решением, и действительно, первый процесс в конвейере умрет, когда попытается вывести его в мертвый процесс grep.
Но если выища текст, который появляется рядом с последним текущим выводом хвоста, тогда grep уже прочитает весь ввод из хвоста (в одном блоке), и, следовательно, больше не будет текстового вывода в журнале, который нужно отправить внизканал как grep уже прочитал его перед выходом (или, может быть, он уже находился в буфере канала) - по крайней мере, это мое понимание.
Использование параметра -m1 в grep выглядит так, как будто он работает точночто вы хотите, и оставьте ввод сразу после соответствующей строки, но, похоже, это не имело значения или помогло мне в поиске аналогичной функциональности.Я подозреваю, что буферный канал все еще хранит весь текст, выводимый из tail, или по какой-то другой причине для tail не осталось ничего для вывода.Вы хотели, чтобы этот текст после grep-match все еще оставался для вывода следующим, потому что это то, что убило бы ваш хвост, когда он попытался (все еще рискованно - что произойдет, если его последняя строка по какой-то причине?), И вернуло управление вызывающему скрипту.
Я нашел способ обойти это - вывести что-либо в конец файла журнала, когда grep завершит работу;то есть.
tail -f logfile |(grep -q; echo >> logfile)
У меня есть теория, что (если мое предположение верно), вы можете заставить канал меньше буферизоваться, чтобы он работал без этого, или, возможно, добавив huponexitустановка команды для соответствующего компонента канала - т.е. в (возможно, фигурных) скобках поможет;но я не заботился о добавлении пустой строки в файл журнала, и он работал нормально, и это всего лишь меньший тестовый скрипт (так что это не долговечный файл журнала, который должен придерживаться формата для другой обработки).
shopt -s huponexit был бы полезен, но для его недолговечности.
PS Мой первый пост здесь, я бы хотел сделать это в качестве комментария к существующему ответу, а не повторять материал, но я неЯ думаю, что теперь могу.