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

Linux /frequency unix tee命令如何将stdout终端输出写入文件?如果输出太大,linux,bash,unix,tee,Linux,Bash,Unix,Tee,我将一些工具stdout重定向到tee命令,以便可以在终端和日志文件中看到当前的进度 这里是我运行工具的代码段,它的stdout被提供给tee命令,这个代码段是从tcl脚本编写的 $(EH_SUBMIT) $(ICC_EXEC) $(OPTIONS) -f ./scripts/$@.tcl | tee -i ./logs/$@.log 我可以在终端上看到当前的实时进度,但在日志文件中看不到相同的观察结果!它将标准输出逐块写入日志文件 tee是如何工作的?它是按块写还是按时间写,还是两者都写?

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

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

$(EH_SUBMIT) $(ICC_EXEC) $(OPTIONS) -f ./scripts/$@.tcl | tee -i ./logs/$@.log
我可以在终端上看到当前的实时进度,但在日志文件中看不到相同的观察结果!它将标准输出逐块写入日志文件

tee
是如何工作的?它是按块写还是按时间写,还是两者都写? 如果是块,最小块大小是多少?如果是时间,最短持续时间是多少


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

除非程序自己处理缓冲,否则IO流的缓冲在libc中处理。标准行为是:如果缓冲区输出到终端,则按行缓冲;如果缓冲区输出到非终端,则按块缓冲,即文件或管道。这就是为什么输出会出现在您描述的日志文件中:逐块。此行为用于性能优化

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

stdbuf -oL your_program >> your.log &
tail -f your.log
-oL
表示按行缓冲区标准。

来自,强调添加:

tee实用程序应将标准输入复制到标准输出,在零个或多个文件中进行复制tee实用程序不应缓冲输出。

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


…如果您的程序依赖标准C库来确定其默认行为,则将取消该操作。

您的进度是写入标准输出还是写入标准输出?也许您的进程/操作系统在缓冲区满之前不会刷新缓冲区。您如何准确地观察到日志文件是按块写入的?例如,tail-f命令每秒只轮询文件一次,即使文件没有被写入,也会显示文件正在被写入的样子。@Kees-Jan这是错误的<如果您通过
-s
选项,code>tail将处于休眠状态。@knittl我仅通过stdout。@Kees Jan在cygwin环境中,
inotify
不可用,因为它是内核功能。在这种情况下,你是对的!;)感谢其他方法/解决方案,让我先试试,但整个办公室设置都是这样的,我很难改变一些重要的事情。
stdbuf -oL yourProgram | tee file