Linux命令的I / O简单超时

时间:2011-02-10 17:13:05

标签: linux bash shell timeout io

首先是这个有趣挑战的背景。持续集成构建通常在开发和测试死锁,循环或导致永无止境测试的其他问题时会出现故障。因此,通知构建失败的所有机制都变得无用。

如果构建日志文件的输出为零超过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年前制作了一个类似这样的剧本,在一段时间不活动之后用数据电话线连接到日本,但不记得我是怎么做的。

此致 韦恩

3 个答案:

答案 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