linux - 如何获得 “instant"的 “tail -f”输出作为输入?

标签 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 脚本可以从 tail 中获取输出。所以我高度怀疑这是由标准输入/标准输出缓冲区大小控制的。如何立即得到输出?

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

最佳答案

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

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

关于linux - 如何获得 “instant"的 “tail -f”输出作为输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22162743/

相关文章:

linux - 如何与实时进程和OOM killer 交好?

c - 将 mmap 与 PROT_NONE 与 PROT_READ 结合使用之间是否存在性能差异?保护写入

bash - 如何 "unescape"bash 的输出 `printf "%q"`

通过 tail grep 多个文件

java - Eclipse 中的平台特定代码

java - linux 和 java 中的特殊字符($)处理

Linux bash : how to replace 2 words in a file from bash command line

bash - 就地在文件中将时间戳转换为纪元

Linux 下的 Java RandomAccessFile.java 无法正常工作

相当于 "tail"命令的 Powershell 几乎可以远程工作