does/frequent unix tee 命令如何将stdout 终端输出写入文件?如果输出太大

How does/frequent unix tee command write stdout terminal output to file? if the output is too big

我正在将一些工具标准输出重定向到 tee 命令,以便可以在终端和日志文件中看到当前进度

这是我使用 运行 工具的代码片段,它的标准输出被馈送到 tee 命令,这个代码片段是从 tcl 脚本编写的。

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

我可以在终端上看到当前的实时进度,但在日志文件中却看不到同样的观察结果!并将标准输出逐块写入日志文件

tee 是如何运作的?它是按块还是按时间或两者兼而有之? 如果块,最小块大小是多少?如果是时间,最短持续时间是多少?

我需要解析实时日志条目以进行一些数据分析(因为我通过 tail -f 读取日志文件,然后随着日志文件的增长推送新数据)。

除非程序自己处理缓冲,否则 IO 流的缓冲是在 libc 中处理的。标准行为是:如果到达终端,则逐行缓冲输出;如果到达 non-terminal,即文件或管道,则逐块缓冲输出。这就是输出如您所描述的那样出现在日志文件中的原因:逐块。此行为是为了性能优化。

在 Linux 上,stdbuf 命令可用于 运行 具有调整缓冲区的程序。您需要像这样 运行 您的程序:

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

-oL 表示按行缓冲标准输出。

来自the POSIX spec for tee,重点补充:

The tee utility shall copy standard input to standard output, making a copy in zero or more files. The tee utility shall not buffer output.

所以 -- tee 不是你的问题。几乎可以肯定的是,您的程序 正在缓冲它写入标准输出的内容(这是许多编程语言的默认设置,包括 C,当标准输出不是 TTY 时)。

stdbuf -oL yourProgram | tee file

...将,如果您的程序依赖于标准 C 库来确定其默认行为,请抑制它。