A primeira instância de um loop for sai se eu estiver procurando por um status de saída específico

A primeira instância de um loop for sai se eu estiver procurando por um status de saída específico

Estou tentando obter monitoramento de disco de um dispositivo de armazenamento. Posso consultar o dispositivo e sair.

por exemplo - vol_list

dr_prdoracle_bkup  83%
dr_test  6%
infra_backup  3%
logs  28%
oem_shared  2%
prd_backup  51%
rhev_export  24%
ss_backup  2%
ss_data  23%

Aqui estou tentando alarmar a porcentagem usada. Então, aqui estou tentando criar um aviso @50% e um crítico @70%

Os limites são analisados ​​na linha de comando

WarnSpace=$2
CritSpace=$2


ST_OK=0
ST_WR=1
ST_CR=2
ST_UK=3

for line in $(cat "vol_list"); do
SpaceUsed=`echo ${line}|awk '{print $2}'|sed 's/%//'`
volume=`echo ${line}|awk '{print $1}'`

if [ -n "$WarnSpace" -a -n "$CritSpace" ]
then
    if [ "$SpaceUsed" -ge "$WarnSpace" -a "$SpaceUsed" -le "$CritSpace" ]
    then
                #echo "WARNING - ${output} | ${perfdata}"
                echo "WARNING; $volume: total $SpaceUsed"%""
        exit $ST_WR
           elif [ "$SpaceUsed" -ge "$CritSpace" ]
    then
                #echo "CRITICAL - ${output} | ${perfdata}"
                echo "CRITICAL; $volume: total $SpaceUsed"%""

        exit $ST_CR


fi
done

Quando eu uso o status de saída, ele sai do loop, por exemplo

./purefs_check.sh  -w 50 -c 70

WARNING; dev_client: total 67%

Se eu remover o código de saída, obtenho o que espero

WARNING; dev_client: total 67%
CRITICAL; dev_data: total 89%
CRITICAL; dev_vendor: total 99%
WARNING; dr_client: total 54%
CRITICAL; dr_prdoracle_bkup: total 78%
WARNING; prd_backup: total 51%

O que eu preciso é terminar o loop e me dar um status de saída de 1 para Warning e 2 para Critical .

De preferência apenas 1 código de saída >1 entradas.

Então aqui eu gostaria de ver

./purefs_check.sh  -w 50 -c 70 |grep WAR ;echo $?
WARNING; dev_client: total 67%
WARNING; dr_client: total 54%
WARNING; prd_backup: total 51%
1
CRITICAL; dev_data: total 89%
CRITICAL; dev_vendor: total 99%
CRITICAL; dr_prdoracle_bkup: total 78%
2

Qualquer ajuda seria apreciada ...

Responder1

exitsairá do shell, imediatamente. Se quiser definir um código de saída para ser usado posteriormente, você precisará definir um sinalizador ou salvar o código de saída manualmente.

#!/bin/bash
warns=""
crits=""
for x in ...; do
    if warning_condition; then 
        warns=1                 # or keep a count with warns=$((warns + 1))
    elif critical_condition; then
        crits=1 
    fi
done
[ "$crits" ] && exit 2
[ "$warns" ] && exit 1

Ou mesmo

#!/bin/bash
exit_code=0
set_exit_code() { 
    # save the greatest given exit code
    [ "$1" -gt "$exit_code" ] && exit_code=$1
}
for x in ...; do
    if warning_condition; then 
        set_exit_code 1
    elif critical_condition; then
        set_exit_code 2
    fi
done
exit "$exit_code"

Quanto a isso...

$ ./purefs_check.sh  -w 50 -c 70 |grep WAR ;echo $?

não funcionará, pois $?conterá o código de saída do arquivo grep. Isso poderia ser usado para descobrir se havia alguma linha de saída contida WAR, mas não acho que era isso que você queria.

Se quiser classificar os avisos de saída primeiro, você precisará coletar os avisos e avisos críticos nas matrizes e imprimi-los no final. Ou simplesmente analise os dados duas vezes e procure primeiro os avisos e os críticos somente depois disso.

Responder2

Você tem:

WarnSpace=$2
CritSpace=$2

e você invoca o script como

./purefs_check.sh  -w 50 -c 70 

Portanto, o valor do CritSpace é 50.

Você não está processando as opções. Em vez disso, faça isso:

#!/bin/bash

ST_OK=0
ST_WR=1
ST_CR=2
ST_UK=3

while getopts :w:c: opt; do
    case $opt in
        w) WarnSpace=$OPTARG ;;
        c) CritSpace=$OPTARG ;;
        *) echo "Warning: unknown option -$opt: ignoring it" >&2 ;;
    esac
done
shift $((OPTIND - 1))

if [[ -z "$WarnSpace" ]]; then
    echo "Error: specify a warning threshold with -w" >&2
    exit $ST_UK
elif [[ -z "$CritSpace" ]]; then
    echo "Error: specify a critical threshold with -c" >&2
    exit $ST_UK
fi

warn=0
crit=0
while read -r volume SpaceUsed; do
    SpaceUsed=${SpaceUsed//[^[:digit:]]/}   # delete all non-digits

    if (( SpaceUsed >= CritSpace )); then
        echo "CRITICAL; $volume: total $SpaceUsed"
        ((crit++))
    elif (( SpaceUsed >= WarnSpace )); then
        echo "WARNING; $volume: total $SpaceUsed"
        ((warn++))
    fi
done < vol_list

((crit > 0)) && exit $ST_CR
((warn > 0)) && exit $ST_WR
exit $ST_OK

informação relacionada