其他答案是正确的,说您需要确保标准输出不缓冲。
需要注意的另一件事是Jenkins本身会逐行缓冲。如果您有一个缓慢运行的进程,它会发出单个字符(例如,打印出一个nunit测试套件摘要 . 成功的测试和 E 对于错误),直到行尾才会看到任何内容。
.
E
[对于我在Windows机箱上运行的Jenkins 1.572,这是真的。]
对于某些命令,包括 tee 非缓冲的最佳选择是一个叫做的程序 unbuffer 从 expect 包。
tee
unbuffer
expect
的 用法示例: 强>
代替
somecommand | tee /some/path
做
somecommand | unbuffer -p tee /some/path
的 来源和更多信息: 强>
其他每个答案都针对一个或另一个程序,但我在这里找到了一个更通用的解决方案:
https://unix.stackexchange.com/a/25378
您可以使用 stdbuf 改变任何程序的缓冲行为。
stdbuf
在我的例子中,我是从shell脚本输出管道输出 tee 和 grep 将行拆分为控制台或基于内容的文件。如OP所述,控制台正在悬挂。这解决了它:
grep
./slowly_parse.py login.csv |tee >(grep -v LOG: > out.csv) | stdbuf -oL -eL grep LOG:
最终我发现我可以通过 --line-buffered 为了相同的结果grep:
--line-buffered
./slowly_parse.py login.csv |tee >(grep -v LOG: > out.csv) | grep --line-buffered LOG:
操作系统本质上是缓冲输出数据,以节省CPU,Jenkins也是如此。
看起来你正在使用shell命令来运行你的Ruby脚本 - 我建议直接通过专用插件运行你的Ruby脚本:
的 Jenkins Ruby插件 强>
(可能需要安装它)
确保你的脚本正在刷新stdout,stderr。 在我的情况下,我有一个类似于你描述的抛光问题,但我使用的是python。 python下面的代码为我修复了它:
import sys sys.stdout.flush()
我不是Ruby代码,但谷歌揭示了以下内容:
$stdout.flush
在我看来,这 python -u 也有效。
python -u
例如。在批处理命令中
python -u foo.py
这里最简单的解决方案是打开同步缓冲区输出。 @Craig在他的回答中写到的东西,但是一行解决方案将涵盖整个脚本,并且不要求你多次刷新缓冲区。
写吧
STDOUT.sync = true
背后的逻辑很简单,为避免使用IO操作多次缓冲输出。要禁用此用途
STDOUT.sync = false
这是Ruby解决方案。