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

3
我希望监视一个日志文件,当新的日志消息符合我定义的模式(比如包含“error”)时,发送邮件给我。
为此,我编写了一个名为monitor.py的Python脚本,主要部分如下:
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脚本才能从tail得到输出。因此,我非常怀疑这是由stdin/stdout缓冲区大小控制的。如何立即获得输出?

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

2个回答

5

大多数Linux程序会在标准输出(stdout)连接到终端(TTY)时使用行缓冲(line buffering),否则使用完全缓冲(full buffering)。您可以使用stdbuf来强制使用行缓冲。

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

看了一下 man stdbuf,我们是应该在 tail -f 或者 python 命令前加上 stdbuf 前缀,还是两个命令都可以? - anishsane
谢谢John,这绝对是正确的方向!但我仍然无法使它按预期工作,你能用吗?我的stdbuf版本是8.4,根据我的空白终端,我认为即使使用stdbuf -oL,我的Python脚本仍然无法读取来自tail -f的输出。 - Wenzhong
@anishsane,你有什么进展了吗? - Wenzhong

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接