我有一个运行很长时间的批处理过程,该过程将一些调试和过程信息输出到stdout。如果我只是从终端运行,则可以跟踪“它在哪里”,但是数据变得太多,并滚动到屏幕之外。
如果我将输出重定向到文件“> out.txt”,则最终会得到整个输出,但会对其进行缓冲,因此我不再能看到它现在正在做什么。
有没有一种方法可以重定向输出但不缓冲其写入?
我有一个运行很长时间的批处理过程,该过程将一些调试和过程信息输出到stdout。如果我只是从终端运行,则可以跟踪“它在哪里”,但是数据变得太多,并滚动到屏幕之外。
如果我将输出重定向到文件“> out.txt”,则最终会得到整个输出,但会对其进行缓冲,因此我不再能看到它现在正在做什么。
有没有一种方法可以重定向输出但不缓冲其写入?
Answers:
您可以使用setvbuf
C中的调用来显式设置标准流的缓冲选项(请参阅此链接),但是如果您要修改现有程序的行为,请尝试stdbuf
(coreutils
显然是从7.5版开始的一部分)。
这stdout
最多缓冲一行:
stdbuf -oL command > output
这将stdout
完全禁用缓冲:
stdbuf -o0 command > output
./configure && make
票价。您甚至不必在事后安装它,只需使用stdbuf
二进制off即可src/
。
您可以使用以下script
命令将行缓冲输出输出到文件:
stty -echo -onlcr # avoid added \r in output
script -q /dev/null batch_process | tee output.log # Mac OS X, FreeBSD
script -q -c "batch_process" /dev/null | tee output.log # Linux
stty echo onlcr
batch_process
追加&
了上述命令,则该命令会立即终止而不完成)就像一个非常普通的用例,并且b)此处没有关于这种咒语如何工作的解释。
我发现的最简单的解决方案(不需要安装任何第三方软件包)在Unix&Linux站点的类似线程中提到:使用script
命令。它很旧,可能已经安装了。
$ script -q /dev/null long_running_command | print_progress # FreeBSD, Mac OS X
$ script -q -c "long_running_command" /dev/null | print_progress # Linux
请注意,该script
命令的第一个文件名参数是要写入的日志文件。如果仅运行script -q your_command
,则将覆盖缩进以与日志文件一起运行的命令。man script
在尝试之前,请先检查一下以确保安全。
尝试script
命令;如果您的系统有此文件,它将以文件名作为参数,所有转储到stdout的文本都将复制到该文件中。当安装程序需要交互时,这非常有用。
将输出重定向到文件中,并使用tail -f
命令跟随文件。
编辑
如果仍然遭受缓冲,请使用syslog工具(通常是无缓冲的)。如果批处理过程是作为Shell脚本运行的,则可以使用logger命令执行此操作。如果批处理作业以脚本语言运行,则无论如何应该有一个日志记录工具。
This answer is useful
无效的答案呢?
您可以使用tee
命令,只是魔术!
someCommand | tee logFile.log
将同时显示在控制台中并写入日志文件。
tee
不会停止任何缓冲。
tee
不会避免一些缓冲,而只会让您看一下输出是什么。这就是@JamesDean想要的(因为我没有理解他的问题),但是我认为这里的缓冲并不是真正的问题。如果您有更多详细信息,请告诉我。
tee
来更好地查看未得到的输出?
>
您在控制台上看不到任何东西。我猜@JamesDean使用“缓冲”一词来形容这一点。我将在他的问题上发表评论,让他多说一些他想要的东西。