设置shell脚本的超时,使其在时间结束时退出(0)

时间:2016-06-30 07:49:00

标签: linux bash shell jenkins

当我设置Jenkins作业并发现有关shell脚本超时的问题时。

它的工作原理如下:

启动Jenkins→control.sh已启动→test1.sh已在control.sh启动

control.sh的部分代码如下:

#!/bin/sh
source func.sh     

export TIMEOUT=30
# set timeout as 30s for test1.sh

( ( sleep $TIMEOUT && function_Timeout ) & ./test1.sh ) 
# this line of code is in a = loop actually
# it will launch test2.sh, test3.sh... one by one
# later, I want to set 30s time out for each of them.

function_Timeout() {
  if [ ! -f test1_result_file]: then
    killall test1.sh
    # the test1_result_file will not 
    # be created if test1.sh is not finished executing.
  fi
}

func.sh的一部分如下

#!/bin/sh
function trap_fun() {
  TRAP_CODE=$?
  { if [ $TRAP_CODE -ne 0 ]; then
      echo "test aborted"
    else
      echo "test completed"
  } 2>/dev/null

trap "trap_fun" EXIT

Jenkins作业启动control.sh后,整个control.sh将在时间结束时终止,并且到达killall test1.sh行,Jenkins作业停止并失败。

我想这是因为test1.sh已被杀死且退出代码不是0,因此会导致此问题。

所以我的问题是,是否有终止或结束子脚本(由主要脚本启动,如我的情况下的control.sh)退出代码0

7月1日更新:

感谢目前为止的答案,我尝试了@Leon的建议,但我发现超时杀戮行动发送的代码124仍然被陷阱代码捕获 - 陷阱" trap_fun& #34; EXIT,位于func.sh。

我添加了更多细节。我做了很多谷歌工作但仍未找到解决此问题的正确方法:(

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

使用 coreutils 中的timeout实用程序:

#!/bin/sh

timeout 30 ./test1.sh
status=$?
if [ $status -eq 124 ] #timed out
then
    exit 0
fi
exit $status

请注意,这与您的超时处理版本略有不同,其中test1.sh的所有正在运行的实例如果其中任何一个超时都将被终止。

答案 1 :(得分:0)

我最终解决了这个问题,我在每个testX.sh中添加了以下代码。

trap 'exit 0' SIGTERM SIGHUP

在接收到killall信号后,正常使test1.sh退出。

感谢所有帮助!