Die erste Instanz einer For-Schleife wird beendet, wenn ich nach einem bestimmten Beendigungsstatus suche

Die erste Instanz einer For-Schleife wird beendet, wenn ich nach einem bestimmten Beendigungsstatus suche

Ich versuche, eine Festplattenüberwachung von einem Speichergerät zu erhalten. Ich kann das Gerät abfragen und eine Ausgabe erhalten.

zB --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%

Hier versuche ich, einen Alarm bei der Nutzung in Prozent auszulösen. Hier versuche ich also, eine Warnung bei 50 % und eine kritische Warnung bei 70 % zu erstellen.

Die Schwellenwerte werden auf der Kommandozeile analysiert

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

Wenn ich den Exit-Status verwende, bricht es aus der Schleife aus, z. B.

./purefs_check.sh  -w 50 -c 70

WARNING; dev_client: total 67%

Wenn ich den Exit-Code entferne, bekomme ich das, was ich erwarte

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%

Was ich brauche, ist, die Schleife zu beenden und mir einen Beendigungsstatus von 1 für „Warnung“ und 2 für „Kritisch“ zu geben.

Vorzugsweise nur 1 Exitcode >1 Einträge.

Hier möchte ich also sehen

./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

Jede Hilfe wäre willkommen ...

Antwort1

exitwird die Shell verlassen, sofort. Wenn Sie einen Exit-Code festlegen möchten, der später verwendet werden soll, müssen Sie ein Flag setzen oder den Exit-Code manuell speichern.

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

Oder auch

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

Was das betrifft...

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

es wird nicht funktionieren, da $?es den Exit-Code von enthält grep. Damit könnte man herausfinden, ob es Ausgabezeilen gab, die enthielten WAR, aber ich glaube nicht, dass Sie das wollten.

Wenn Sie die ausgegebenen Warnungen zuerst sortieren möchten, müssen Sie die Warnungen und kritischen Warnungen in Arrays sammeln und am Ende ausdrucken. Oder gehen Sie die Daten einfach zweimal durch und suchen Sie zuerst nach Warnungen und erst danach nach kritischen.

Antwort2

Du hast:

WarnSpace=$2
CritSpace=$2

und Sie rufen das Skript auf wie

./purefs_check.sh  -w 50 -c 70 

Der CritSpace-Wert beträgt also 50.

Sie verarbeiten die Optionen überhaupt nicht. Tun Sie stattdessen Folgendes:

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

verwandte Informationen