How to get “instant" output of “tail -f” as input?

回眸只為那壹抹淺笑 提交于 2020-01-02 07:13:42

问题


I want to monitor a log file, when a new log message match my defined pattern (say contain “error”), then send out an email to me.

To do that, I wrote a python script monitor.py, the main part looks like:

import sys

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

It works well when I use tail my.log | python monitor.py, then I switch to tail -f my.log | python monitor.py, then it doesn’t work, at least not immediately.

I have done some tests, when the new content to the log accumulate up to 8KB, then my python script can get output from tail. So I highly suspect that this is controlled by the stdin/stdout buffer size. How can I get the output immediately?

One more question, when I use tail -f my.log and tail -f my.log | grep error, why it could show me the output immediately?


回答1:


Most Linux programs will use line buffering if stdout is connecting to a TTY and full buffering otherwise. You can use stdbuf to force line buffering.

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



回答2:


There's a patch to add unbuffered output to tail, dating from 2008. which appears to have been rejected and my own (BSD) manpage does not indicate it. Perhaps you could download coreutils, apply the patch, compile tail yourself and it may still work?



来源:https://stackoverflow.com/questions/22162743/how-to-get-instant-output-of-tail-f-as-input

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!