接続パフォーマンステストを実行するシェルスクリプトがあり、時間が長すぎるとタイムアウトが発生します。
タイムアウト後は、エラーが発生したときのシステム状態を理解できるように、いくつかのコマンドの結果を記録します。タイムアウトしたテストステップに基づいていくつかのコマンドを実行したいと思います。
私は次のスクリプトを思いついた。
#!/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; }