タイムアウト後にスクリプトが停止する場所の追跡

タイムアウト後にスクリプトが停止する場所の追跡

接続パフォーマンステストを実行するシェルスクリプトがあり、時間が長すぎるとタイムアウトが発生します。

タイムアウト後は、エラーが発生したときのシステム状態を理解できるように、いくつかのコマンドの結果を記録します。タイムアウトしたテストステップに基づいていくつかのコマンドを実行したいと思います。

私は次のスクリプトを思いついた。

#!/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; }

関連情報