我用它来检查日志文件的日志行,直到发生特定事件(取自此答案“监视文件直到找到字符串”):
(tail -f -n 0 test.log &) | grep -q 'SPEFICIC LOG MESSAGE'
Run Code Online (Sandbox Code Playgroud)
这可行,但我还希望在等待事件时将日志行打印到标准输出。我正在寻找类似的东西tee,但我想同时打印和管道。
我尝试了这个答案来管道并观察管道输出?, 导致:
(tail -f -n 0 test.log &) | tee /dev/fd/2 | grep -q 'SPEFICIC LOG MESSAGE'
Run Code Online (Sandbox Code Playgroud)
但随后该命令永远不会退出,大概是因为在找到匹配项时grep无法中断,因此继续将数据传送到?tailtailtee
退出后grep,tee只有当它尝试向管道写入更多内容时,您才会因 SIGPIPE 而退出。这就是管道的工作原理。这意味着您还需要一行来自tail. 最终tee会退出,除非打印后永远保持沉默。tailSPEFICIC LOG MESSAGE
tail \xe2\x80\xa6 | grep \xe2\x80\xa6总体上是相似的。的技巧(tail \xe2\x80\xa6 &)使你的主 shell 不等待tail(它等待子 shell,而子 shell 不等待,这要归功于tail)&。
您可以使用相同的技巧tee:
(tail -f -n 0 test.log &) | (tee /dev/fd/2 &) | grep -q \'SPEFICIC LOG MESSAGE\'\nRun Code Online (Sandbox Code Playgroud)\n主 shell 将等待两个子 shell 和grep。子 shell 几乎会立即退出,所以这才是grep最重要的。退出时grep,主 shell 将继续。
tee将停留在后台,直到尝试写入更多内容。只有这样它才会收到 SIGPIPE 并退出。这需要日志中额外一行。
反过来tail将停留在后台,直到退出后尝试写入更多内容tee。这需要日志中的另一行。除非你tail很聪明。GNUtail立即检测到损坏的管道,它不需要技巧。在 GNU 中使用该技巧tail是无害的,因此当有疑问时,请使用它。
tee不是那么聪明,它确实需要技巧。
我给您的命令应该可以工作,但请记住tee,tail它将保留在后台,直到日志中出现下一行。如果你的尾巴不聪明,那么它会留下另一条线。
| 归档时间: |
|
| 查看次数: |
1506 次 |
| 最近记录: |