
저장 장치에서 일부 디스크 모니터링을 얻으려고 합니다. 장치에 문의하고 나갈 수 있습니다.
예: 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%
루프를 끝내고 Warning에 대해 1, Critical에 대해 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