La primera instancia de un bucle for sale si estoy buscando un estado de salida específico

La primera instancia de un bucle for sale si estoy buscando un estado de salida específico

Estoy intentando obtener supervisión del disco desde un dispositivo de almacenamiento. Puedo consultar el dispositivo y salir.

por ejemplo -- 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%

Aquí estoy tratando de alarmar sobre el porcentaje utilizado. Así que aquí estoy intentando crear una advertencia al 50 % y una crítica al 70 %.

Los umbrales se analizan en la línea 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

Cuando uso el estado de salida, se sale del bucle, por ejemplo

./purefs_check.sh  -w 50 -c 70

WARNING; dev_client: total 67%

Si elimino el código de salida obtengo lo 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%

Lo que necesito es finalizar el ciclo y darme un estado de salida de 1 para Advertencia y 2 para Crítico.

Preferiblemente solo 1 código de salida >1 entradas.

Así que aquí me gustaría 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

Cualquier ayuda sería apreciada ...

Respuesta1

exitsaldrá del shell, inmediatamente. Si desea configurar un código de salida para usarlo más adelante, deberá configurar una marca o guardar el código de salida 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

O incluso

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

En cuanto a esto...

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

no funcionará ya que $?contendrá el código de salida del archivo grep. Eso podría usarse para averiguar si había líneas de salida que contenían WAR, pero no creo que eso sea lo que querías.

Si primero desea ordenar las advertencias de salida, deberá recopilar las advertencias y las advertencias críticas en las matrices e imprimirlas al final. O simplemente revise los datos dos veces y busque las advertencias primero y las críticas solo después.

Respuesta2

Tienes:

WarnSpace=$2
CritSpace=$2

e invocas el script como

./purefs_check.sh  -w 50 -c 70 

Entonces el valor de CritSpace es 50.

No estás procesando las opciones en absoluto. Haz esto en su lugar:

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

información relacionada