当我设置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。
我添加了更多细节。我做了很多谷歌工作但仍未找到解决此问题的正确方法:(
感谢您的帮助!
答案 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退出。
感谢所有帮助!