시간 초과 후 스크립트가 중지되는 위치 추적

시간 초과 후 스크립트가 중지되는 위치 추적

연결 성능 ​​테스트를 수행하는 쉘 스크립트가 있는데 시간이 너무 오래 걸리면 시간 초과가 발생합니다.

시간 초과 후에는 오류 발생 당시 시스템 상태를 이해할 수 있도록 일부 명령의 결과를 기록합니다. 시간 초과된 테스트 단계를 기반으로 일부 명령을 실행하고 싶습니다.

나는 다음 스크립트를 생각해 냈습니다.

#!/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정수 값을 할당합니다. 쉘 연산의 맥락에서 FIRST모든 값에 할당한 , , 값은 SECOND리터럴 값이 아닌 설정되지 않은 변수 이름으로 간주되므로 0으로 평가됩니다.THIRD$TESTCASE

unset FIRST
let TESTCASE=FIRST
echo "$TESTCASE"

0

...또는...

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

10

따라서 , 또는 $TESTCASE라는 변수를 실행 하기 전에 해당 환경에 추가 하지 않는 한 모든 할당은 동일한 값을 할당합니다.FIRSTSECONDTHIRDINITIALexport

FIRST쉘 변수에 문자열을 할당하려면 $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; }

관련 정보