我正在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库来确定它的默认行为,那就抑制它。