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

当我build立一个Jenkins作业,发现shell脚本超时的问题。

它是这样工作的:

启动Jenkins→启动control.sh →在control.sh中启动test1.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的build议,但是我发现由超时的kill行为发送的代码124仍然被陷阱代码陷阱 – 陷阱“trap_fun”EXIT,它在func.sh中。

我添加了更多的细节。 我做了很多谷歌的工作,但仍然没有find一个正确的方法来解决这个问题:(

感谢您的亲切帮助!

使用coreutilstimeout实用程序:

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

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

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

 trap 'exit 0' SIGTERM SIGHUP 

收到killall信号后正常退出test1.sh。

感谢所有的帮助!