
Я пытаюсь получить некоторый мониторинг диска с устройства хранения данных. Я могу запросить устройство и получить вывод.
например -- 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%
Здесь я пытаюсь оповестить о проценте использования. Поэтому здесь я пытаюсь создать предупреждение @50% и Критическое @70%
Пороговые значения анализируются в командной строке.
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
Когда я использую статус выхода, он выходит из цикла, например
./purefs_check.sh -w 50 -c 70
WARNING; dev_client: total 67%
Если я уберу код выхода, я получу то, что ожидаю.
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%
Мне нужно завершить цикл и получить статус выхода 1 для предупреждения и 2 для критического состояния.
Предпочтительно только 1 код выхода >1 записи.
Вот я хотел бы увидеть
./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
Любая помощь будет оценена по достоинству...
решение1
exit
выйдет из оболочки, немедленно. Если вы хотите задать код выхода для использования позже, вам нужно будет установить флаг или сохранить код выхода вручную.
#!/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
Или даже
#!/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"
Что касается этого...
$ ./purefs_check.sh -w 50 -c 70 |grep WAR ;echo $?
это не сработает, так как $?
будет содержать код выхода grep
. Это можно использовать для выяснения, были ли какие-либо выходные строки, содержащие WAR
, но я не думаю, что это то, что вы хотели.
Если вы хотите сначала отсортировать выходные предупреждения, вам нужно будет собрать предупреждения и критические предупреждения в массивы и вывести их в конце. Или просто дважды пройтись по данным и сначала искать предупреждения, а затем только критические.
решение2
У вас есть:
WarnSpace=$2
CritSpace=$2
и вы вызываете скрипт как
./purefs_check.sh -w 50 -c 70
Таким образом, значение CritSpace равно 50.
Вы вообще не обрабатываете варианты. Вместо этого сделайте следующее:
#!/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