跟踪超时后脚本停止的位置

跟踪超时后脚本停止的位置

我有一个 shell 脚本正在执行连接性能测试,如果花费太长时间,我就会超时。

超时后,它会记录一些命令的结果,以便我可以了解发生故障时的系统状态。我想根据超时的测试阶段运行一些命令。

我想出了以下脚本:

#!/bin/bash
TESTCASE="INITIAL"

function testing()
{
    let TESTCASE="FIRST"
    #do some testing

    let TESTCASE="SECOND"
    #do some testing

    let TESTCASE="THIRD"
    #do some testing
}

function logonerror(){
    if [ "$TESTCASE" = "FIRST" ]; then                  
       #logging command relevant to first test case
    elif [ "$TESTCASE" = "SECOND" ]; then                  
       #logging command relevant to second test case
    elif [ "$TESTCASE" = "THIRD" ]; then                  
       #logging command relevant to third test case                   
    fi
    #some additional standard logging
}

timeout 7200 cat  <( testing )
if (($? == 124)); then
    logonerror
fi
cleanup

我唯一的问题是,哪个阶段超时并不重要,在进行日志记录时,它总是认为它处于初始阶段。

如何确保测试阶段信息得到正确更新?

答案1

你的第一个问题是:

let TESTCASE="UNSET_INTEGER_VARIABLE_NAME"

let处理数学。在语句中进行的赋值let将分配整数值。在 shell 算术上下文中FIRST,您分配给所有值的 , SECOND,值的计算结果为零,因为它们被认为是未设置的变量名称 - 而不是文字值。THIRD$TESTCASE

unset FIRST
let TESTCASE=FIRST
echo "$TESTCASE"

0

...或者...

FIRST=10
let TESTCASE=FIRST
echo "$TESTCASE"

10

因此,您所做的每个赋值都会分配相同的值,除非在运行之前将$TESTCASE任何名为FIRSTSECONDTHIRD或 的变量INITIAL添加到其环境中。export

要将字符串分配FIRST给 shell 变量,$TESTCASE您应该执行以下操作:

TESTCASE=FIRST
echo "$TESTCASE"

FIRST

您也可以考虑case

logonerror(){
    case $TESTCASE in
    (1)   : logging commands relevant to 1st test case
    ;;
    (2)   : logging commands relevant to 2nd test case
    ;;
    (3)   : logging commands relevant to 3rd test case
    ;;
    esac; : logging commands relevant to all test cases
}
testing()
    case $TESTCASE in
    (1) : do some testing
    ;;
    (2) : do some testing
    ;;
    (3) : do some testing
    ;;
    esac

    trap  cleanup         EXIT
{   trap 'logonerror >&2; exit' PIPE
    for TESTCASE in 1 2 3; do testing; done >&2;:
}|{ read -t 7200; kill -PIPE -0; }

相关内容