首先是这个有趣挑战的背景。持续集成构建通常在开发和测试死锁,循环或导致永无止境测试的其他问题时会出现故障。因此,通知构建失败的所有机制都变得无用。
如果构建日志文件的输出为零超过5分钟,解决方案将是构建脚本超时,因为构建过程会定期写出单元测试的名称。所以这是识别它“冻结”的最好方法。
好。现在这个细节......
构建服务器使用Hudson运行一个简单的bash脚本,该脚本根据Nant和MSBuild(所有在Windows上)调用更复杂的构建脚本。
到目前为止,网络上的所有解决方案都涉及命令总运行时间的超时。但是在这种情况下,该解决方案失败了,因为测试可能会在前5分钟内挂起或冻结。
到目前为止我们已经想到了什么:
首先,这是高级bash命令在Hudson中运行完整的测试套件。
build.sh clean free test
该命令只是将所有Nant和MSBuild构建日志记录发送到stdout。
很明显,我们需要将输出发送到文件:
build.sh clean free test 2>&1 | tee build.out
然后并行命令需要休眠,检查文件的修改时间,如果超过5分钟则终止主进程。此时kill -9
会很好 - 一旦冻结就没有任何优雅。
这是你可以帮助的部分。
事实上,我在15年前制作了一个类似这样的剧本,在一段时间不活动之后用数据电话线连接到日本,但不记得我是怎么做的。
此致 韦恩
答案 0 :(得分:1)
build.sh clean free test 2>&1 | tee build.out &
sleep 300
kill -KILL %1
答案 1 :(得分:0)
您可以使用timeout
:
timeout 300 command
答案 2 :(得分:0)
通过编写bash脚本来解决这个问题。
它被称为iotimeout,带有一个参数,即秒数。
你这样使用它:
build.sh clean dev test | iotimeout 120
iotimeout有2个循环。
一个是回读线回路的简单读取线路循环 它还使用touch命令更新a的修改时间 每次写一行时都会生成tmp文件。不幸的是,事实并非如此 可以监视build.out文件,因为Windoze没有 更新文件修改时间,直到关闭文件。哦,好吧。
另一个循环在后台运行,这是一个永远的循环 睡10秒,然后检查修改时间 临时文件。如果超过120秒那么 该循环强制整个进程组退出。
唯一棘手的事情是返回原始的退出代码 程序。 Bash为您提供了一个PIPESTATUS数组来解决这个问题。
此外,弄清楚如何杀死整个程序组 一些研究但结果很简单 - 杀死0