특정 종료 상태를 찾고 있는 경우 for 루프의 첫 번째 인스턴스가 종료됩니다.

특정 종료 상태를 찾고 있는 경우 for 루프의 첫 번째 인스턴스가 종료됩니다.

저장 장치에서 디스크 모니터링을 얻으려고 합니다. 장치와 출력을 쿼리할 수 있습니다.

예를 들어 - 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

관련 정보