当我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一个正确的方法来解决这个问题:(
感谢您的亲切帮助!
使用coreutils
的timeout
实用程序:
#!/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。
感谢所有的帮助!