
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
exit
wird 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