同时在屏幕和文件上显示标准输出

时间:2013-10-09 13:58:42

标签: bash shell unix scripting stdout

我想将标准输出从我的脚本记录到文件中,但也可以在屏幕上显示它以进行实时监控。该脚本每秒输出约10次。

我尝试将stdout重定向到一个文件,然后从另一个终端尾随-f该文件,但由于某种原因,tail正在更新屏幕的速度明显慢于脚本写入文件。

造成这种滞后的原因是什么?是否有另一种方法可以在我的终端和文件中获取一个标准输出流以供以后检查?

3 个答案:

答案 0 :(得分:8)

我不能说为什么tail滞后,但您可以使用tee

Redirect output to multiple files, copies standard input to standard output and also to any files given as arguments. This is useful when you want not only to send some data down a pipe, but also to save a copy.

示例:<command> | tee <outputFile>

答案 1 :(得分:3)

你看到多少滞后?几百个字符?几秒钟?分钟?小时?

你看到的是缓冲。几乎所有文件读取和写入都是缓冲的。这包括输入和输出,并且管道内也发生了一些缓冲。传递一个数据包而不是一次传输一个字节的效率更高。我相信HFS +文件系统的数据存储在UTF-16中,而Mac OS X通常使用UTF-8作为默认值。 (NTFS还使用UTF-16存储数据,而Windows默认使用代码页作为字符数据。)

因此,如果您从另一个终端运行tail -f,您可能会看到来自tail的缓冲,但是当您使用管道然后tee时,您可能会在管道,并在tee命令中,这可能是你看到滞后的原因。

顺便说一句,你怎么知道 lag ?你怎么知道程序写入磁盘的速度有多快?您是否在程序中打印出某些内容以帮助跟踪对文件的写入?

在这种情况下,你可能不会像你想象的那样落后。文件写入也是缓冲的。因此,很可能滞后不是tail -f,而是从您的脚本到文件。

答案 2 :(得分:2)

使用tee命令:

tail -f /path/logFile | tee outfile