【发布时间】:2011-03-20 21:50:37
【问题描述】:
我有一个类似的脚本:
#!/bin/bash
exec /usr/bin/some_binary > /tmp/my.log 2>&1
问题是some_binary 将其所有日志记录发送到标准输出,并且缓冲使我只能看到几行块的输出。当某些事情卡住时,这很烦人,我需要看看最后一行的内容。
在我执行会影响 some_binary 的 exec 之前,有什么方法可以使 stdout 无缓冲,以便它有更有用的日志记录?
(包装脚本只是在exec之前设置了几个环境变量,所以在perl或python中的解决方案也是可行的。)
【问题讨论】:
-
丹尼斯的回答完全正确。这就是为什么。 Unix 上使用 C stdio 输出的程序将在输出不进入终端时进行缓冲(大大提高性能),除非使用
setvbuf告知不要这样做;几乎没有人为此烦恼。expect系统(其中unbuffer是一个微不足道的应用程序)使用带有 Unix 伪终端设备 (ptys) 的黑魔法来运行带有不是真正终端的终端的程序,这样包装的程序就不会缓冲它的输出。这很聪明,但请注意:大多数系统只有有限数量的 pty;自然无缓冲的程序更好。 -
顺便说一句,这在 Windows 上效果不佳。那是因为在那个平台上的 expect 使用调试魔法而不是终端魔法(因为这是 Windows 非常不同的领域)。
-
谢谢。我决定选择修改
some_binary来做正确的事,而不是依赖黑魔法。expect很棒,但我不想在这里...
标签: bash logging exec unbuffered-output