我用它来检查日志文件的日志行,直到发生特定事件(取自此对Monitoring a file until a string is found 的回答):
(tail -f -n 0 test.log &) | grep -q 'SPEFICIC LOG MESSAGE'
这可行,但我还希望在等待事件时将日志行打印到标准输出。我正在寻找类似的东西tee
,但我想同时打印和管道。
我试过这个对 Pipe 的回答并观察管道输出?, 导致:
(tail -f -n 0 test.log &) | tee /dev/fd/2 | grep -q 'SPEFICIC LOG MESSAGE'
但是随后该命令永远不会退出,大概是因为在找到匹配项时grep
无法中断tail
,因此tail
继续将数据传递给tee
?
退出后,只有当它尝试向管道写入更多内容时
grep
,您才会因为 SIGPIPE 而退出。tee
这就是管道的工作原理。这意味着您需要从tail
. 终究tee
会退出,除非打印后永远沉默。tail
SPEFICIC LOG MESSAGE
tail … | grep …
大体上是相似的。with 的技巧(tail … &)
使您的主 shell 不等待tail
(它等待子 shell,而子 shell 不等待,tail
感谢&
)。您可以使用相同的技巧
tee
:主 shell 将等待两个子 shell 和
grep
. 子外壳几乎会立即退出,所以这很grep
重要。退出时grep
,主 shell 将继续。tee
将留在后台,直到它尝试写入更多内容。只有这样它才能获得 SIGPIPE 并退出。这需要日志中的额外一行。反过来将留在后台,直到退出
tail
后尝试写入更多内容。tee
这需要日志中的另一行。除非你tail
很聪明。GNUtail
会立即检测到破损的管道,它不需要技巧。在 GNU 中使用该技巧tail
是无害的,因此如有疑问,请使用它。tee
不是那么聪明,它确实需要技巧。我给你的命令应该有效,但请记住
tee
,tail
它将留在后台,直到下一行出现在日志中。如果你的尾巴不聪明,那么它会停留在另一条线上。