我想将标准输出从我的脚本记录到文件中,但也让它在屏幕上显示给我以进行实时监控。该脚本每秒输出大约 10 次。
我试图将标准输出重定向到一个文件,然后从另一个终端 tail -f 那个文件,但由于某种原因,tail 更新屏幕的速度明显慢于脚本写入文件的速度。
是什么导致了这种滞后?是否有另一种方法可以在我的终端和文件中获取一个标准输出流以供以后检查?
我不能说为什么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>
你看到多少滞后?几百字?几秒钟?分钟?小时?
你看到的是缓冲。几乎所有文件读取和写入都被缓冲。这包括输入和输出,并且在管道内也发生了一些缓冲。一次传递一个数据包而不是一个字节更有效。我相信 HFS+ 文件系统上的数据以 UTF-16 存储,而 Mac OS X 通常默认使用 UTF-8。(NTFS 也使用 UTF-16 存储数据,而 Windows 默认使用代码页存储字符数据)。
因此,如果您tail -f
从另一个终端运行,您可能会看到来自 的缓冲tail
,但是当您使用管道然后tee
时,您可能在管道和命令中有一个缓冲区,tee
这可能是您看到滞后的原因。
顺便说一句,你怎么知道有滞后?你怎么知道你的程序写入磁盘的速度有多快?您是否在程序中打印出一些内容来帮助跟踪对文件的写入?
在这种情况下,您可能不会像您想象的那样落后。文件写入也被缓冲。因此,滞后很可能不是来自 . tail -f
,而是来自您的脚本写入文件。
使用 tee 命令:
tail -f /path/logFile | tee outfile