연결 성능 테스트를 수행하는 쉘 스크립트가 있는데 시간이 너무 오래 걸리면 시간 초과가 발생합니다.
시간 초과 후에는 오류 발생 당시 시스템 상태를 이해할 수 있도록 일부 명령의 결과를 기록합니다. 시간 초과된 테스트 단계를 기반으로 일부 명령을 실행하고 싶습니다.
나는 다음 스크립트를 생각해 냈습니다.
#!/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
라는 변수를 실행 하기 전에 해당 환경에 추가 하지 않는 한 모든 할당은 동일한 값을 할당합니다.FIRST
SECOND
THIRD
INITIAL
export
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; }