#!/bin/bash
SUBJECT="WARNING CPU USAGE HIGH"
TO=gmail id
MESSAGE=/tmp/messages
echo "#######################" > $MESSAGE
echo "CPU statistics as follows.." >> $MESSAGE
mpstat >> $MESSAGE
echo "#######################" >> $MESSAGE
CPU_USAGE=$(top -b -n1 | awk '/^Cpu/ {print $2}' | cut -d. -f1)
[ $CPU_USAGE -gt 85 ] && mail -s "$SUBJECT" "$TO" < $MESSAGE`
./cpu.sh: line 11: [: -gt: unary operator expected
Какова могла бы быть причина
проблема состоит в том, что CPU_USAGE
заканчивается как пустая строка. Это вызывает проблему здесь:
[ $CPU_USAGE -gt 85 ]
После того, как переменная оболочки оценена, вышеупомянутое становится:
[ -gt 85 ]
Это перестало работать, потому что аргумент перед эти -gt
теперь отсутствует.
получить непустое CPU_USAGE
, мы должны заменить:
CPU_USAGE=$(top -b -n1 | awk '/^Cpu/ {print $2}' | cut -d. -f1)
с:
CPU_USAGE=$(top -b -n1 | awk '/^%Cpu/ {print $2}' | cut -d. -f1)
, где %
был добавлен.
, Как упомянуто выше, когда CPU_USAGE
является пустым и неупомянутым, мы получаем ошибку "Унарного оператора":
$ CPU_USAGE=""; [ $CPU_USAGE -gt 85 ] && echo yes
bash: [: -gt: unary operator expected
Это - лучшая практика для заключения в кавычки переменных оболочки в таких ситуациях. Если мы действительно заключаем его в кавычки, то мы получаем другое сообщение об ошибке:
$ CPU_USAGE=""; [ "$CPU_USAGE" -gt 85 ] && echo yes
bash: [: : integer expression expected
, В то время как мы все еще получаем ошибку, это сообщение об ошибке, по крайней мере, более информативно: это говорит, что $CPU_USAGE
не число.
Эти cut
процесс не нужен. Мы можем заменить:
CPU_USAGE=$(top -b -n1 | awk '/^%Cpu/ {print $2}' | cut -d. -f1)
с:
CPU_USAGE=$(top -b -n1 | awk -F'[ .]+' '/^%Cpu/ {print $2}')
Ваша строка
top -b -n1 | awk '/^Cpu/ {print $2}' | cut -d. -f1
является неправильной. В первую очередь, Вы просите, чтобы AWK нашел строку, запускающуюся с Cpu
, когда на самом деле это запускается с %Cpu
.
cut
часть. Можно использовать awk
непосредственно:
$ top -b -n1 | awk '/^%Cpu/ {gsub(/\./," ");print $2}'
31
<час> Для будущего, можно отладить сценарии с set -x
наверху сценария после #!/bin/bash
строка. Кроме того, используйте https://www.shellcheck.net / , который проверит синтаксис сценария оболочки