Я пытаюсь получить некоторый мониторинг диска с устройства хранения. Я могу запросить устройство и выйти из него.

Например -- том_список

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
ilkkachu 29 Май 2018 в 16:13
Я могу быть устаревшим здесь, но если это скрипт для nagios, я думал, что nagios ожидал только одну строку предупреждения или критический вывод. Вы хотите, чтобы несколько отчетов файловой системы были в одной строке.
 – 
Jeff Schaller
29 Май 2018 в 16:03
Привет Джефф. Возможен случай, когда более 1 тома превышают пороговые значения. Вот почему я хотел бы ясности на выходе.
 – 
Cromwer
29 Май 2018 в 16:14

2 ответа

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
ilkkachu 29 Май 2018 в 16:17
Очень признателен . Я могу иметь цикл for как функцию и вызывать его для предупреждений и критических...
 – 
Cromwer
29 Май 2018 в 16:11

У тебя есть:

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
0
glenn jackman 29 Май 2018 в 17:26
Спасибо . Гленн. Пространство должно занимать позицию 4 файла . Расчет процента. SpaceUsed=${SpaceUsed//[^[:digit:]]/} вызывает проблемы и присваивает всем томам статус Critical . КРИТИЧЕСКИЙ; dev_backup: всего 1051200020170307095454172210016 КРИТИЧЕСКИЙ; dev_client: всего 2000020161025144206172230016
 – 
Cromwer
30 Май 2018 в 11:18
Когда я запускаю этот код с предоставленным вами файлом vol_list, я получаю CRITICAL; dr_prdoracle_bkup: total 83 и WARNING; prd_backup: total 51, а статус выхода равен 2.
 – 
glenn jackman
30 Май 2018 в 17:17
«Используется пробел в позиции 4 файла» — что это значит? какой файл?
 – 
glenn jackman
30 Май 2018 в 17:18