简单的I / O超时为Linux命令

首先是这个有趣的挑战的背景。 在开发和testing死锁,循环或导致永无止境的testing的其他问题期间,持续集成构build经常会失败。 所以通知构build失败的所有机制都变得毫无用处。

如果构build日志文件的输出超过5分钟,那么解决scheme将会使构build脚本超时,因为构build过程会在进行时按常规写出unit testing的名称。 所以这是识别“冻结”的最好方法。

好的。 现在,基本上…

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

到目前为止,networking上的所有解决scheme都涉及命令总运行时间的超时。 但是这种解决scheme在这种情况下失败了,因为testing可能会在前5分钟内挂起或冻结。

我们到目前为止的想法是:

首先,这里是高级别的bash命令,在Hudson运行完整的testing套件。

build.sh clean free test 

该命令只是将所有的Nant和MSBuild构build日志logging发送到标准输出。

很显然,我们需要将输出发送到一个文件:

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

然后并行一个命令需要睡眠,检查文件的修改时间,如果超过5分钟,杀死主进程。 在这一点上, kill -9会很好 – 一旦冻结,就不需要优雅的东西。

这是你可以帮忙的部分。

事实上,15年前我写了一个这样的脚本,在没有任何活动的情况下用数据电话线连接到日本,但不记得我是怎么做的。

韦恩,真诚

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

您可能可以使用timeout

 timeout 300 command 

通过编写一个bash脚本来解决这个问题。

它被称为iotimeout与一个参数是秒数。

你这样使用它:

build.sh clean dev test | iotimeout 120

iotimeout有2个循环。

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

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

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

另外,搞清楚如何杀死整个程序组是一些研究,但事实证明这很容易 – 杀死0