【发布时间】:2019-03-19 16:17:28
【问题描述】:
我正在编写一个障碍来阻止脚本的执行,直到记录了某个关键字。脚本很简单:
tail -F -n0 logfile.log | while read LINE; do
[[ "$LINE" == *'STOP'* ]] && echo ${LINE} && break;
done
或
tail -F -n0 logfile.log | grep -m1 STOP
问题是它不会在检测到关键字后立即退出,而是仅在写入下一行之后退出。即:
printf "foo\n" >> logfile.log # keeps reading
printf "foo\n" >> logfile.log # keeps reading
printf "STOP\n" >> logfile.log # STOP printed
printf "foo\n" >> logfile.log # code exits at last
不幸的是,我不能依赖这样一个事实,即在“STOP”之后将记录另一行(至少不在对我的目的有用的间隔内)。
到目前为止找到的解决方法是tail 也是我知道的另一个文件,我肯定会经常更新,但是什么是“干净”的解决方案,以便代码在记录后立即退出 STOP?
【问题讨论】:
-
也许写入日志的进程缓冲了它的输出?
-
也许可以,但是该行会立即打印出来,因此就像卡在
echo和break之间。有了缓冲区,echo也会被延迟 -
只有当
tail尝试再次写入管道时,您才会终止,但由于管道已损坏(因为您的while循环已终止)它会崩溃。它仅在尝试写入时评估pipe的状况。不要使用管道!
标签: bash pipe sh tail process-substitution