2017-02-10 12 views
0

서버 모니터링을위한 사용자 정의 bash 스크립트에서 실제적으로 내 CentOS 서버가 일부 동작을 수행하도록하고 리소스가 예상보다 많은 시간 과부하되는 경우 경고합니다.bash에서 부동 소수점 숫자 비교하기

라인 (17) : [: 5.74 : 정수 표현

지금 정의에 의해 모든 iostat의 결과는 부동 소수점 숫자와 나는 이미 내 iostat 명령 (WAIT)에 awk을 사용하고 내가 내 bash는 스크립트를 만들 수있는 방법 * 예상 정수 대신에 하나를 기대 하는가?

는 ** 값 5.74는 현재 iostat의 결과를 나타냅니다

#!/bin/bash 

if [[ "`pidof -x $(basename $0) -o %PPID`" ]]; then 
#  echo "Script is already running with PID `pidof -x $(basename $0) -o %PPID`" 
     exit 
fi 

UPTIME=`cat /proc/uptime | awk '{print $1}' | cut -d'.' -f1` 
WAIT=`iostat -c | head -4 |tail -1 | awk '{print $4}' |cut -d',' -f1` 
LOAD=`cat /proc/loadavg |awk '{print $2}' | cut -d'.' -f1` 

if [ "$UPTIME" -gt 600 ] 
then 
     if [ "$WAIT" -gt 50 ] 
     then 
       if [ "$LOAD" -gt 4 ] 
       then 
         #action to take (reboot, restart service, save state sleep retry) 
         MAIL_TXT="System Status: iowait:"$WAIT" loadavg5:"$LOAD" uptime:"$UPTIME"!" 
         echo $MAIL_TXT | mail -s "Server Alert Status" "[email protected]" 
         /etc/init.d/httpd stop 
#      /etc/init.d/mysql stop 
         sleep 10 
#      /etc/init.d/mysql start 
         /etc/init.d/httpd start 
       fi 
     fi 
fi 

에 CentOS (최종) 6.8 2.6.32-642.13.1.el6.x86_64

+0

배쉬는 정수 연산 만 수행합니다. 부동 소수점을 수행하려면 bash 이외의 도구 (예 : awk)를 사용해야합니다. –

+0

그러나 정수 상수와 비교하기 때문에 더 쉽습니다 (훨씬 쉽습니다!). –

+0

BTW, 일반적으로 bash에서 부동 소수점 연산을 수행하는 것은 [BashFAQ # 22] (http://mywiki.wooledge.org/BashFAQ/022)입니다. –

답변

1

일반적으로, 당신은 다른 것을 사용하는 것이 필요할 것 출시 BashFAQ #22에 설명 된대로 네이티브 셸 수학보다. 그러나 정수와 비교하기 때문에 이것은 쉽습니다. 소수점에서자를 수 있습니다.

[ "${UPTIME%%.*}" -gt 600 ] # truncates your UPTIME at the decimal point 
[ "${WAIT%%.*}" -gt 50 ] # likewise