CPU Usage Checking Script
cpuscheck.sh
#!/bin/bash VERSION="0.2" # log dir LOGDIR=. function defaultopt() { if [ x$TIME == x ]; then TIME=5 fi if [ x$ALLCPU == x ]; then ALLCPU=3 fi if [ x$CORE == x ]; then CORE=20 fi if [ x$CONDITION == x ]; then CONDITION=OR fi } # loading conf if [ -f ./option_cpuscheck.conf ]; then . ./option_cpuscheck.conf defaultopt else echo "There is no file 'option_cpuscheck.conf'" echo "So, It apply default options" defaultopt fi # Options Function function usage() { echo -e "\e[34m\e[1m*** The options are :\e[21\033[0m" echo "-h or --help: help" echo "--allcpu : Threadhold of utilization CPU(all)" echo "--core : Threadhold of utilization per core." echo "--time : Time for gather the sar data." echo "--condition : Conditions for determining utilization of ALLCPU and CORE." echo "" echo -e "\e[34m\e[1m*** Usage :\e[21\033[0m" echo "example 1 : $0" echo " => option_cpuscheck.conf 파일의 옵션값을 적용하여 실행" echo "" echo "example 2 : $0 --allcpu=5 --core=30 --time=10 --condition=AND" echo " => sar 1초 간격 '10초' 동안 평균 total cpu 사용률 5% 'AND' core 사용률 중 30%를 넘기는 core가 1개 이상 있으면 Abnormal 출력함" echo " => 명령행에 별도의 옵션을 지정하고 실행하면 해당 옵션은 option_cpuscheck.conf 값보다 우선되어 적용." echo "" echo "example 3 : $0 --allcpu=4 --core=25" echo " => sar 1초 간격 '옵션초' 동안 평균 total cpu 사용률 4% '옵션조건' core 사용률 중 25%를 넘기는 core가 1개 이상 있으면 Abnormal 출력함" echo " => 명령행에 옵션을 넣지 않은 값은 자동으로 option_cpuscheck.conf 파일의 옵션값을 적용함." echo "" echo "example 4 : $0 --allcpu=99 --core=25 --condition=or" echo " => sar 1초 간격 '옵션초' 동안 평균 total cpu 사용률 99% 'OR' core 사용률 중 25% 넘기는 core가 있으면 Abnormal 출력함" echo " => --allcpu=99 와 --condition=OR 를 동시에 적용하면 core별 사용률만 따짐." echo -e "\033[0m" } # Options Input while [ "$1" != "" ]; do PARAM=`echo $1 | awk -F= '{print $1}'` VALUE=`echo $1 | awk -F= '{print $2}'` case $PARAM in -h | --help) usage exit ;; -v | --version) echo "$0 Version: $VERSION" exit ;; --allcpu) ALLCPU=$VALUE if [ x$ALLCPU == x ] || [ $ALLCPU -ge 100 ]; then ALLCPU=3 fi ;; --core) CORE=$VALUE if [ x$CORE == x ] || [ $CORE -ge 100 ]; then CORE=20 fi ;; --time) TIME=$VALUE if [ x$TIME == x ]; then TIME=5 fi ;; --condition) CONDITION=$VALUE if [ x$CONDITION == x ]; then CONDITION=OR fi CONDITION=$(echo "$CONDITION" | tr '[:upper:]' '[:lower:]') if ! [ "$CONDITION" = "and" ] || [ "$CONDITION" = "or" ]; then CONDITION=OR fi ;; *) echo -e "\033[1;31m\e[5mError\e[25m: unknown option parameter \"$PARAM\"\033[0m" echo "" usage exit 1 ;; esac shift done # Run SAR RUN="sar -P ALL 1 $TIME | grep Average" # logging LOGTIME=`date +%Y-%m-%d"_"%T"_"%Z" UnixTime="%s` LOGFILE=$(echo $LOGDIR/`basename $0 | awk -F '.' '{print "log_"$1}'`_$HOSTNAME.log) TMPFILE=$(echo $LOGFILE'_tmp') echo $LOGTIME >> $LOGFILE echo "Command: '$RUN', Threshold(All):'$ALLCPU', Threshold(Core):'$CORE', Condi='$CONDITION'" >> $LOGFILE printf -vch "%94s" "" >> $LOGFILE printf "%s\n" "${ch// /-}" >> $LOGFILE echo "Collecting... CPU Usage for $TIME seconds." eval `echo $RUN` >> $LOGFILE printf -vch "%94s" "" >> $LOGFILE printf "%s\n" "${ch// /-}" >> $LOGFILE echo "Status : Normal" >> $LOGFILE printf -vch "%94s" "" >> $LOGFILE printf "%s\n" "${ch// /=}" >> $LOGFILE UTIME=$(echo $LOGTIME | awk -F "UnixTime=" '{print $2}') awk "/$UTIME/,/^=/" $LOGFILE >> $TMPFILE sed -i '/'$UTIME'$/,$d' $LOGFILE CPUCOUNT=$(grep $UTIME -A 100 $TMPFILE | grep ^Average: | grep -v -e CPU -e all | wc -l) ALLCPUUSE=$(grep $UTIME -A 100 $TMPFILE | grep ^Average: | grep all | awk '{ total = $3 + $5 } END { print total }') ALLCPUUSE2=$(printf "%5.2f\n" $ALLCPUUSE) YESNO=$(echo "$ALLCPUUSE $ALLCPU YES NO*" | awk '{ if ( $1 <= $2 ) print $3; if ( $1 >= $2 ) print $4 }') sed -i '/CPU/ s/$/ | %us+sy OK?/' $TMPFILE sed -i "/all/ s/$/ | $ALLCPUUSE2 $YESNO/" $TMPFILE FLAG1=0 if [ "$YESNO" == "NO*" ]; then FLAG1=1 fi COUNT=0 FLAG2=0 while [ $CPUCOUNT -gt $COUNT ] do COREUSE=$(grep $UTIME -A 100 $TMPFILE | grep ^Average: | awk -v count="$COUNT" '{ if ( $2 == count ) print $0 }' | awk '{total = $3 + $5}END{print total}') COREUSE2=$(printf "%5.2f\n" $COREUSE) YESNO2=$(echo "$COREUSE $CORE YES NO*" | awk '{ if ( $1 <= $2 ) print $3; if ( $1 >= $2 ) print $4 }') if [ $COUNT -gt 9 ]; then sed -i "/Average: $COUNT/ s/$/ | $COREUSE2 $YESNO2/" $TMPFILE else sed -i "/Average: $COUNT/ s/$/ | $COREUSE2 $YESNO2/" $TMPFILE fi if [ $YESNO2 == "NO*" ]; then let "FLAG2 += 1" fi let "COUNT += 1" done function abnormalmessage() { echo -e "\033[1;31m- 먼저 아래 명령을 쉘에 복사/붙여넣기 하여 로그의 (NO*) 부분을 확인하십시오.\e[21\033[0m" echo -e "\033[1;31mgrep $UTIME -A 100 $LOGFILE\e[21\033[0m" echo -e "\033[1;31m- 그리고 $LOGDIR/readme.txt 파일의 'Abnormal 가이드'를 참고 하세요.\e[21\033[0m" echo "" echo -e "\033[1;31mStatus: Abnormal\e[21\033[0m" sed -i 's/Normal/Abnormal/g' $TMPFILE } function status1() { if [ $FLAG1 -eq 1 ] || [ $FLAG2 -ge 1 ]; then abnormalmessage else echo -e "\033[1;32mStatus: Normal\e[21\033[0m" fi } function status2() { if [ $FLAG1 -eq 1 ] && [ $FLAG2 -ge 1 ]; then abnormalmessage else echo -e "\033[1;32mStatus: Normal\e[21\033[0m" fi } case $CONDITION in "OR"|"or") status1 ;; "AND"|"and") status2 ;; *) echo "Check option of condition. Current CONDITION Value is: $CONDITION" , So apply OR.; CONDITION=OR ; status1 ;; esac cat "$TMPFILE" >> $LOGFILE rm -f $TMPFILE exit 0
option_cpuscheck.conf
## Value of Options for cpuscheck.sh # *Unit: Second. *Mean: Time for gather the sar data. *Available value: 1 ~ 180. *Recommended value: 5 ~ 10 TIME=5 # *Unit: Percentage. *Mean: Threadhold of utilization CPU(all). *Available value: 1 ~ 99. *Recommended value: 3 ~ 5 ALLCPU=4 # *Unit: Percentage. *Mean: Threadhold of utilization per core. *Available value: 1 ~ 99. *Recommended value: 20 ~ 30 CORE=25 # *Unit: Words. *Mean: Conditions for determining utilization of ALLCPU and CORE. *Available value : AND or OR, *Recommended value: OR CONDITION=OR
CPU Usage Checking Script