如何将“tail -f”的“即时”输出作为输入?

时间:2014-03-04 04:11:13

标签: linux bash tail

我希望监控日志文件,当新的日志消息与我定义的模式匹配时(比如包含“错误”),然后向我发送一封电子邮件。

为此,我编写了一个python脚本monitor.py,主要部分如下:

import sys

for line in sys.stdin:
    if "error" in line:
        print line 

当我使用tail my.log | python monitor.py时效果很好,然后切换到tail -f my.log | python monitor.py,然后它不起作用,至少不会立即生效。

我做了一些测试,当日志的新内容累积到8KB时,我的python脚本可以从尾部输出。所以我高度怀疑这是由stdin / stdout缓冲区大小控制的。如何立即获得输出?

还有一个问题,当我使用tail -f my.logtail -f my.log | grep error时,为什么它可以立即显示输出?

2 个答案:

答案 0 :(得分:4)

如果stdout连接到TTY,则大多数Linux程序将使用行缓冲,否则将使用完全缓冲。您可以使用stdbuf强制进行行缓冲。

stdbuf -oL tail -f my.log | python monitor.py

答案 1 :(得分:0)

有一个patch to add unbuffered output to tail,可以追溯到2008年。它似乎是rejected而我自己的(BSD)联机帮助页并没有表明它。也许你可以下载coreutils,应用补丁,自己编译尾巴,它可能仍然有用吗?