2013-12-11 4 views
2

Как я могу сломать tail -f в bash? Поскольку этот вопрос связан с этим вопросомКак сломать команду tail -f в bash

tail -f | awk and end tail once data is found

Я попытался следующие:

#! /bin/bash 

tvar="testing" 
(set -o pipefail && tail -f <<< "$tvar" | awk '{print; exit} END{ exit 1}' ) 

Но сценарий все еще висит на tail -f

+0

Можете ли вы попробовать ['inotifywait'] (http://linux.die.net/man/1/inotifywait)? – anishsane

ответ

4

Ну, проблема не 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 
+1

Я добавил оператор 'exit', см. Обновление. 'awk' теперь входит в предложение' END' и должен выйти. Но скрипты все еще висят. –

+0

Да, потому что _your_ 'tail -f' странно в том аспекте, что он больше ничего не пишет. Он прекратится, как только он попытается что-то написать в закрытой трубе. Но так как этот странный случай использования 'tail -f' для печати переменной, очевидно, не является вашим _real_ usecase, возможно, вы могли бы рассказать нам немного больше о том, что вы изначально пытались достичь. – Alfe

+0

Да это связано с этим сообщением: http://stackoverflow.com/questions/20500685/tail-f-awk-and-end-tail-once-data-is-found –

1

кажется, что переход от использования <<< к echo "$tvar" | tail -f делает то, что вы хотите вместо этого?

$> cat test.sh 
#! /bin/bash 

tvar="testing" 
(set -o pipefail && echo "$tvar" | tail -f | awk '{print} END{ exit 1}' ) 
$> ./test.sh 
testing 
$> 

Хотя awk ничего не печатает после этого.

+0

Да, это работает, но это не работает, если 'tail -f' читается из файла. Например, 'tail -f file.txt | awk ..' не работает. –

+0

Согласен, но это возвращается к пункту @alfe, сделанному выше - EOF не получил хвост для выхода. Поэтому он сидит в ожидании большего количества ввода из файла навсегда. –

Смежные вопросы