有没有办法将输出重定向到文件而无需在 unix/linux 上缓冲?

有没有办法将输出重定向到文件而无需在 unix/linux 上缓冲?

我有一个长时间运行的批处理过程,它会将一些调试和进程信息输出到标准输出。如果我只是从终端运行,我可以跟踪“它在哪里”,但随后数据会变得太多并滚出屏幕。

如果我将输出重定向到文件“> out.txt”,我最终会得到整个输出,但它被缓冲了,所以我无法再看到它现在在做什么。

有没有办法重定向输出但又不缓冲其写入?

答案1

您可以使用 C 中的调用明确设置标准流的缓冲选项setvbuf(请参阅此链接),但如果你想修改现有程序的行为,请尝试stdbufcoreutils(显然是从 7.5 版开始的一部分)。

缓冲stdout最多一行:

stdbuf -oL command > output

这将stdout完全禁用缓冲:

stdbuf -o0 command > output

答案2

script您可以使用如下命令实现行缓冲输出到文件:

stty -echo -onlcr   # avoid added \r in output
script -q /dev/null batch_process | tee output.log        # Mac OS X, FreeBSD
script -q -c "batch_process" /dev/null | tee output.log   # Linux
stty echo onlcr

答案3

在 Ubuntu 上,unbuffer程序(来自expect-dev)包为我解决了这个问题。只需运行:

unbuffer your_command

并且它不会缓冲它。

答案4

尝试该script命令;如果您的系统有该命令,它将以文件名作为参数,所有转储到 stdout 的文本都将复制到该文件中。当安装程序需要交互时,它非常有用。

相关内容