Сценарий мониторинга процессора не запускается должным образом

Мне было интересно, если кто-нибудь может помочь с причинами, что это не срабатывает должным образом

HOSTNAME=`hostname -s`
LOAD=25.00
CAT=/bin/cat
MAILFILE=/home/jboss/monitor.mail
MAILER=/bin/mail
mailto="bob@bob.bob"
CPU_LOAD=`sar -P ALL 1 10 |grep 'Average.*all' |awk -F" " '{print 100.0 -$NF}'`
if [[ $CPU_LOAD > $LOAD ]];
then
PROC=`ps -eo pcpu,pid -o comm= | sort -k1 -n -r | head -1`
echo -e "Please check processes on ${HOSTNAME} the value of cpu load is $CPU_LOAD%.
Highest process is: $PROC" > $MAILFILE
$CAT $MAILFILE | $MAILER -s "CPU Load is on ${HOSTNAME} is $CPU_LOAD %" $mailto
fi

Похоже, что это работает должным образом для sar и ps, но я все еще получаю уведомления по электронной почте о таких вещах, как загрузка процессора составляет 3,18%. Если я что-то упустил, он не должен срабатывать, если нагрузка не превышает 25%.

Хотя кажется, что это более эффективно, если нагрузка превышает 2,5%. Есть предложения?

Спасибо

3 ответа

Вместо того, чтобы использовать:

if [[ $CPU_LOAD > $LOAD ]];then

ты должен использовать

if [[ $CPU_LOAD -gt $LOAD ]]; then

Попробуйте этот код - (протестировано - работает нормально)

$ cat f.sh
HOSTNAME=$(hostname -s)
LOAD=25.00
MAILFILE=$HOME/a.txt
MAILER=/bin/mailx
mailto="vipinkumarr89@gmail.com"
CPU_LOAD=$(sar -P ALL 1 10 |grep 'Average.*all' |awk -F" " '{print 100.0 -$NF}')
if [[ $CPU_LOAD > $LOAD ]];then
{
PROC=$(ps -eo pcpu,pid -o comm= | sort -k1 -n -r | head -1)
echo -e "Please check processes on ${HOSTNAME} the value of cpu load is $CPU_LOAD%.
Highest process is: $PROC" > $MAILFILE
cat $MAILFILE | $MAILER -s "CPU Load is on ${HOSTNAME} is $CPU_LOAD %" $mailto
}
fi

Bash обрабатывает только целые числа, поэтому, чтобы использовать более высокую точность, вы можете сделать что-то вроде этого:

cpu_limit=25
# read the 5min load-average straight from the special file on /proc
read -r _ load_avg _ </proc/loadavg
# multiply by 100 for precision
load_avg=$(bc <<<"scale=0; $load_avg * 100 / 1")
# compare numbers with (( )) instead
if (( load_avg > cpu_limit )); then
   ...
fi
Другие вопросы по тегам