Acompanhar onde o script parou após o tempo limite

2

Eu tenho um script de shell fazendo o teste de desempenho de conexão, que eu tempo limite se demorar muito.

Após o tempo limite, ele registra os resultados de alguns comandos para que eu possa fazer uma ideia do status do sistema no momento da falha. Eu gostaria de executar alguns comandos dependendo de qual fase do teste expirou.

Eu criei o seguinte script:

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

O único problema que tenho é que não importa qual fase expirou, ao fazer o registro, sempre acha que está na fase inicial.

Como posso ter certeza de que as informações da fase de teste são atualizadas corretamente?

    
por Eldros 18.01.2016 / 10:04

1 resposta

2

Seu primeiro problema é:

let TESTCASE="UNSET_INTEGER_VARIABLE_NAME"

let lida com matemática. As atribuições feitas em uma instrução let atribuirão valores inteiros. Em um contexto aritmético de shell, os valores FIRST , SECOND , THIRD que você está atribuindo a $TESTCASE all são avaliados como zero porque são considerados nomes de variáveis não definidos - não valores literais.

unset FIRST
let TESTCASE=FIRST
echo "$TESTCASE"
0

... ou ...

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

Assim, todas as atribuições atribuídas ao mesmo valor são $TESTCASE , a menos que qualquer variável chamada FIRST , SECOND , THIRD ou INITIAL esteja export ed em seu ambiente antes de ser executada. / p>

Para atribuir a string FIRST à variável do shell $TESTCASE , você deve fazer:

TESTCASE=FIRST
echo "$TESTCASE"
FIRST

Você também pode considerar 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; }
    
por 18.01.2016 / 11:51