/ unix tee命令如何将stdoutterminal输出写入文件? 如果输出太大

我正在redirect一些工具标准输出命令,以便当前进度可以在terminal以及日志文件中看到

这里是我正在运行的工具的代码片段,它的stdout被提供给tee命令,而这个代码片段是从tcl脚本编写的。

$(EH_SUBMIT) $(ICC_EXEC) $(OPTIONS) -f ./scripts/$@.tcl | tee -i ./logs/$@.log 

我可以在terminal上看到当前的实时进度,但在日志文件中没有看到相同的观察结果! 它将stdout按块写入日志文件块

tee如何工作? 它是按块还是按时间或两者写入? 如果阻塞什么是最小块大小? 如果是时间最短的时间是多less?

我需要parsing某些数据分析的实时日志条目(因为我通过tail -f读取日志文件,然后在日志文件增长时推送新数据)。

除非程序自己处理缓冲,否则在libc中处理IO流的缓冲。 标准的行为是:如果缓冲区输出线到达终端,则明智地选择缓冲区输出,如果缓冲区输出到非终端,则意味着文件或管道。 这就是为什么输出如下所示出现在日志文件中:chunk by chunk。 这种行为是为了性能优化。

在Linux上, stdbuf命令可以用来运行带有调整缓冲区的程序。 你需要像这样运行你的程序:

 stdbuf -oL your_program >> your.log & tail -f your.log 

-oL表示缓存stdout linewise。

从POSIX规格开始 ,强调补充道:

tee应用程序应将标准输入复制到标准输出中,并将复制到零个或多个文件中。 tee工具不能缓冲输出。

所以 – tee不是你的问题。 几乎可以肯定的是, 你的程序正在缓冲写入stdout的内容(当stdout不是TTY的时候,这在很多编程语言中都是默认的,包括C)。

 stdbuf -oL yourProgram | tee file 

…如果你的程序依靠标准的C库来确定它的默认行为,那就抑制它。