如果我正在寻找特定的退出状态,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

相关内容