2011-02-10 58 views
0

首先介绍这个有趣的挑战。在开发和测试死锁,循环或导致永无止境的测试的其他问题期间,持续集成构建通常会失败。所以通知构建失败的所有机制都变得毫无用处。针对Linux命令的I/O上的简单超时

该解决方案将有构建脚本超时,如果有零点输出为超过5分钟生成日志文件,因为构建定期写出单元测试的名字因为它的收益。所以这是识别“冻结”的最佳方式。

好的。现在的基本...

构建服务器使用Hudson运行一个简单的bash脚本,该脚本调用基于Nant和MSBuild(全部在Windows上)的更复杂的构建脚本。

到目前为止四处撒网的所有解决方案涉及的命令的总运行时间超时。但是这种解决方案在这种情况下失败了,因为测试可能会在前5分钟内挂起或冻结。

我们已经想到至今:

首先,这里的高层bash命令运行完整测试套件哈德森。

build.sh clean free test 

,简单地命令将所有的南特和MSBuild的建立记录到标准输出。

很明显,我们需要三通是输出到文件:

build.sh clean free test 2>&1 | tee build.out 

然后平行命令需要睡觉,检查修改文件的时间,如果超过5分钟杀死的主要过程。 A kill -9在这一点上将会很好 - 一旦冻结就没有优雅的需要。

这是你可以帮助的部分。

其实,我做了这样一个剧本早在15年前杀人的休止期之后的数据电话线来日本的连接,但不记得我是怎么做的。

真诚, 韦恩

回答

1
build.sh clean free test 2>&1 | tee build.out & 
sleep 300 
kill -KILL %1 
+0

的OP被要求超时**没有书面内容五分钟后* *,而不是五分钟的挂钟时间,而不管输出。 (否则,问题将会是https://stackoverflow.com/questions/5161193/how-to-kill-a-child-process-after-a-given-timeout-in-bash的重复) – 2017-11-02 19:22:51

0

您可以使用timeout

timeout 300 command 
+0

问题要求在五分钟后超时**而没有写入内容**,而不管五分钟的挂钟时间,而不管输出如何。 (如果不是这样,这个问题将会是https://stackoverflow.com/questions/5161193/how-to-kill-a-child-process-after-a-given-timeout-in-bash的重复) – 2017-11-02 19:23:31

0

通过编写一个bash脚本解决了这个自己。

这就是所谓的iotimeout与一个参数是多少秒。

您这样使用:

build.sh clean dev test | iotimeout 120

iotimeout具有2个循环。

一个是简单的读线回路,回声线回显但 它也使用触摸命令来更新每次写入一行 tmp文件的修改时间。不幸的是,它不是 可能监视build.out文件,因为Windoze不会 更新文件修改时间,直到您关闭文件。好吧。

另一个循环运行在后台,这是一个永久循环 睡10秒,然后检查修改时间 临时文件。如果该值超过120秒,则循环强制整个进程组退出。

唯一棘手的问题是返回原始 程序的退出代码。 Bash给你一个PIPESTATUS数组来解决这个问题。

而且,搞清楚如何杀死整个节目组 一些研究,但原来是易刚 - 杀0