Ну, проблема не tail -f
но awk
который висит. Он должен заканчиваться при обнаружении EOF (с exit 1
). Но EOF не найден; tail -f
не заканчивается, поэтому не появляется EOF.
Завершить работу awk
, то это также сломает трубу, и tail
получит SIGPIPE (который его прекратит).
Вы должны найти другое условие для прекращения.
EDIT:
Чтобы достичь того, чего вы хотите, вы можете начать tail -f
в фоновом режиме, помните его PID и убить его, как только вы это больше не нужно. Запуск в фоновом режиме и использование трубы в то же время сложно. Самый простой способ сделать это было бы использовать именованный канал (FIFO):
mkfifo log.pipe
tail -f log > log.pipe & tail_pid=$!
awk ... < log.pipe
kill $tail_pid
rm log.pipe
Можете ли вы попробовать ['inotifywait'] (http://linux.die.net/man/1/inotifywait)? – anishsane