2017-02-10 2 views
0

В моей пользовательской Баш скрипт для мониторинга сервера, который фактически сделал, чтобы заставить мой сервер CentOS принимать какие-то действия и предупредить меня, если ресурсы перегружены больше времени, чем ожидалось, я получаю следующее сообщение об ошибкеСравнение чисел с плавающей точкой в ​​Баш

линии 17: [: 5,74: целочисленное выражение ожидается *

Теперь по определению всех IOSTAT результатов являются числами с плавающей точкой, и я уже использовал awk в моей IOSTAT команды (WAIT), так как я могу сделать мой Баш скрипт ожидать один вместо целого?

** Значение 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 (Final) 2.6.32-642.13.1.el6.x86_64

+0

Bash имеет только целочисленную математику; вам нужно использовать инструмент, отличный от 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