我有一个像这样的脚本:
#!/bin/bash
exec /usr/bin/some_binary > /tmp/my.log 2>&1
问题是 some_binary
将其所有日志记录发送到 stdout,缓冲使得我只能看到几行大块的输出。当某些东西卡住时,这很烦人,我需要看看最后一行说了什么。
在我执行会影响 some_binary 的 exec 之前,有什么方法可以使 stdout 无缓冲,以便它具有更有用的日志记录吗?
(wrapper脚本只是在exec之前设置了一些环境变量,所以perl或者python的解决方案也是可行的。)
最佳答案
GNU coreutils-8.5 也有 stdbuf
修改 I/O 流缓冲的命令:
http://www.pixelbeat.org/programming/stdio_buffering/
因此,在您的示例中,只需调用:
stdbuf -oL /usr/bin/some_binary > /tmp/my.log 2>&1
这将允许文本立即逐行显示(一旦在 C 中用行尾 "\n"
字符完成一行)。如果您真的想要立即输出,请改用 -o0
。
如果您不想引入对 expect
的依赖,这种方式可能更可取通过 unbuffer
命令。另一方面,如果您必须让 some_binary
认为它面对的是真正的 tty 标准输出,则需要 unbuffer
方法。
关于bash:强制 exec 进程具有无缓冲的标准输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3332045/