我有一个很长的运行批处理过程,输出一些debugging和处理信息到标准输出。 如果我只是从一个terminal运行,我可以跟踪“它在哪里”,但是数据太多,滚动屏幕。
如果我redirect到输出到一个文件>> out.txt'我最终得到整个输出,但它被缓冲,所以我不能再看到它现在正在做什么。
有没有办法redirect输出,但不使其缓冲写入?
您可以使用C中的setvbuf
调用(请参阅此链接 )明确设置标准stream的缓冲选项,但是如果您尝试修改现有程序的行为,则尝试使用stdbuf
(显然是从版本7.5开始的coreutils
一部分)。
这将stdout
缓冲到一行:
stdbuf -oL command > output
这完全禁用stdout
缓冲:
stdbuf -o0 command > output
您可以通过使用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
在Ubuntu上, unbuffer
程序(来自expect-dev
)包为我做了窍门。 赶紧跑:
unbuffer your_command
它不会缓冲它。
就我个人而言,我更喜欢我想通过tee
检查的命令的pipe道输出。
script
logging了太多的信息,包括按键的时间以及大量的非打印字符。 什么节省更多的是我的人类可读性。
我发现的最简单的解决scheme(不需要安装任何第三方软件包)是在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
命令; 如果你的系统有它,它需要一个文件名作为参数,转储到标准输出的所有文本被复制到文件。 安装程序需要交互时非常有用。
将输出redirect到一个文件中,并使用tail -f
命令跟随该文件。
编辑
如果这仍然有缓冲,然后使用系统日志设施(通常是无缓冲的)。 如果批处理进程作为shell脚本运行,则可以使用logger命令执行此操作。 如果批处理作业以脚本语言运行,则应该有一个日志logging工具。
你可以使用tee
命令,只是魔术!
someCommand | tee logFile.log
someCommand | tee logFile.log
将同时显示在控制台中并写入日志文件。