在I / O简单超时对于Linux命令(simple timeout on I/O for comm

2019-11-04 16:32发布

首先,背景这样一个有趣的挑战。 持续集成构建经常可以导致一个永无止境的测试死锁,循环,或其他问题的开发和测试过程中的故障。 因此,所有的机制用于通知build失败时变得毫无用处。

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

好的。 现在细节问题了...

构建服务器使用Hudson来运行调用基于南特和MSBuild的(所有在Windows上)的更复杂的构建脚本一个简单的bash脚本。

到目前为止,围绕网上,所有的解决方案包括对命令的总运行时间超时。 但是,这个解决方案在这种情况下将失败,因为测试可能会挂起,或在第5分钟冻结。

我们已经想到至今:

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

build.sh clean free test

这个命令只是将所有的南特和MSBuild的建立记录到标准输出。

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

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

然后在平行的命令需要睡觉,检查文件的修改时间,如果超过5分钟杀死主处理。 一个kill -9将被罚款在这一点上-什么优美需要一旦冻结。

这是你可以帮助的部分。

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

真诚,韦恩

Answer 1:

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


Answer 2:

您可以使用timeout

timeout 300 command


Answer 3:

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

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

您可以使用这样的:

的BUILD.sh干净的开发测试| iotimeout 120

iotimeout有2个循环。

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

另一个循环在后台运行,这是一个永远的环路,它睡10秒,然后检查临时文件的修改时间。 如果曾经超过120秒老那么回路迫使整个进程组退出。

唯一棘手的问题是恢复原来的程序的退出代码。 击给你一个PIPESTATUS阵列来解决。

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



文章来源: simple timeout on I/O for command for linux