Aqui está uma maneira, reutilizando o leitor depois de estabelecer que realmente está lendo:
while true
do
exec 3<> myfifo
tail -n0 -f /var/log/syslog >&3 &
tailproc=$!
while ! grep -q start <&3
do
logger start
logger line
done
grep -q end <&3 &
logger end
logger line
wait $!
exec 3<&-
exec 3>&-
kill $tailproc
done
Desde o escritor é bloqueado enquanto ninguém está lendo (entre o primeiro e o segundo grep
) ele não deveria ser possível para o segundo grep
perder a próxima linha.
Isso está funcionando há algumas dezenas de milhares de iterações (com base nos IDs do processo na saída) sem ficar preso.