如何同时打印和管道日志文件?

如何同时打印和管道日志文件?

我使用它来检查日志文件的日志行,直到发生特定事件(取自这个答案监视文件直到找到字符串):

(tail -f -n 0 test.log &) | grep -q 'SPEFICIC LOG MESSAGE'

这可行,但我希望在等待事件时将日志行打印到 stdout。我正在寻找类似的东西tee,但我想同时打印和管道。

我试过这个答案管道并观察管道输出?, 导致:

(tail -f -n 0 test.log &) | tee /dev/fd/2 | grep -q 'SPEFICIC LOG MESSAGE'

但是命令永远不会停止,大概是因为找到匹配项时grep无法中断,所以继续将数据传送到?tailtailtee

答案1

grep退出后,tee只有当尝试向管道写入更多内容时,您的 will 才会因 SIGPIPE 而退出。这就是管道的工作方式。这意味着您需要从tail. teewill exit最终,除非tail打印后永远沉默SPEFICIC LOG MESSAGE

tail … | grep …总体来说类似。使用 的技巧(tail … &)可使主 shell 不等待tail(它改为等待子 shell,而子 shell 则由于 而不等待tail) &

您可以使用相同的技巧tee

(tail -f -n 0 test.log &) | (tee /dev/fd/2 &) | grep -q 'SPEFICIC LOG MESSAGE'

主 shell 将等待两个子 shell 和grep。子 shell 几乎会立即退出,所以这才是grep最重要的。grep退出后,主 shell 将继续运行。

tee会一直留在后台,直到尝试写入更多内容。只有这样它才会收到 SIGPIPE 并退出。这需要日志中多一行。

反过来,tail它会一直留在后台,直到退出后尝试写入更多内容tee。这需要日志中的另一行。除非你tail很聪明。GNUtail会立即检测到管道损坏,因此不需要该技巧。在 GNU 中使用该技巧tail是无害的,因此如有疑问,请使用它。

tee并不是那么聪明,它确实需要技巧。

我给你的命令应该可以工作,但请记住tee,它tail会一直留在后台,直到下一行出现在日志中。如果你的尾巴不够聪明,那么它会再停留一行。

相关内容