Solved

script to get cpu utilization and compare it against a value

Posted on 2009-05-05
11
578 Views
Last Modified: 2013-12-26
Hi I need assistance in a script which main purpose would be to display the cpu utilization and if exceeds threshold it will generate a file and it will send out and email.
#!/bin/bash
 
#LOGFILE=/var/log/monitoring/cpu/util
 
#mkdir -p $LOGFILE
 
#mpstat -u > $LOGFILE/util
UTIL="mpstat -u"
 
#cat $LOGFILE/util | grep -Ev "Linux|%" > $LOGFILE/util1
UTIL1="mpstat -u|grep -Ev "Linux|%""
 
#Deleting empty lines
#sed '/^$/d' $LOGFILE/util1 >> $LOGFILE/util2
UTIL2="sed '/^$/d' $UTIL1"
 
UTIL3="cut -c 21-24 $UTIL2"
echo  $UTIL3

Open in new window

0
Comment
Question by:dpoper1
  • 6
  • 5
11 Comments
 
LVL 84

Expert Comment

by:ozo
ID: 24306554
what did you get in  $UTIL3 ?
0
 

Author Comment

by:dpoper1
ID: 24306580
cut -c 21-24 $UTIL2
./util.sh: line 22: [: too many arguments
0
 

Author Comment

by:dpoper1
ID: 24306623
Here is my code, but I still get the error provided above.

#!/bin/bash
 
LIMIT="50"
ADMINS=myemail@gmail.com
LOGFILE=/var/log/monitoring/cpu/cpuutil.log
 
#mkdir -p $LOGFILE
 
UTIL='mpstat -u'
 
UTIL1='$UTIL|grep -Ev "Linux|%"'
 
#Deleting empty lines
UTIL2='sed '/^$/d' $UTIL1'
 
UTIL3='cut -c 21-24 $UTIL2'
echo  $UTIL3
 
if [ $UTIL3 -gt $LIMIT ]
then
    echo "Current CPU Utilization: $UTIL3" >> $LOGFILE
    echo "CPU Threshold: $LIMIT" >> $LOGFILE
    mail -s "CPU Utilization on $hostname is over CPU Threshold" $ADMINS < $LOGFILE                      
#    scp $LOGFILE root@headnode:/mnt/disk01/alerts/cpu/
fi

Open in new window

0
Free learning courses: Active Directory Deep Dive

Get a firm grasp on your IT environment when you learn Active Directory best practices with Veeam! Watch all, or choose any amount, of this three-part webinar series to improve your skills. From the basics to virtualization and backup, we got you covered.

 
LVL 84

Expert Comment

by:ozo
ID: 24306805
did you mean to use ` instead of ' ?
0
 
LVL 84

Expert Comment

by:ozo
ID: 24306839
and you may have wanted
UTIL3=`mpstat -u | grep -Ev "Linux|%" | sed '/^$/d' | cut -c 21-24`
note `
 not  '

0
 

Author Comment

by:dpoper1
ID: 24306843
I have narrowed down the code, please take a look below, but I still get the following error:


./util.sh: line 13: [: 0.16: integer expression expected




#!/bin/bash
 
LIMIT="50"
ADMINS=myemail@gmail.com
LOGFILE=/var/log/monitoring/cpu            
 
mkdir -p $LOGFILE
 
UTIL1=$(mpstat -u|grep -Ev "Linux|%" | sed '/^$/d' | cut -c 21-24)
 
#echo $UTIL1
 
if [ $UTIL1 -gt $LIMIT ]
then
    echo "Current CPU Utilization: $UTIL3" >> $LOGFILE/cpuutil.log
    echo "CPU Threshold: $LIMIT" >> $LOGFILE/cpuutil.log
#    mail -s "CPU Utilization on $hostname is over CPU Threshold" $ADMINS < $LOGFILE/cpuutil.log
#    scp $LOGFILE/cpuutil.log root@headnode:/mnt/disk01/alerts/cpu/
    rm -f $LOGFILE/cpuutil.log
fi

Open in new window

0
 
LVL 84

Expert Comment

by:ozo
ID: 24306905
can we see what
echo $UTIL1
and
echo $LIMIT
show?
you may need
if [ "$UTIL1" -gt "$LIMIT" ]
0
 
LVL 84

Expert Comment

by:ozo
ID: 24306966
sorry, I see that the error now is different
you might try
if awk "BEGIN{exit $UTIL1 < $LIMIT}"
then
0
 

Author Comment

by:dpoper1
ID: 24306985
take a look at the code, I have modified the if statement to reflect integers as well as the LIMIT VALUE with 2 decimals and I still get an error

0.16
50.01
./util.sh: line 14: [: 0.16: integer expression expected



#!/bin/bash
 
LIMIT="50.01"
ADMINS=myemail@gmail.com
LOGFILE=/var/log/monitoring/cpu
 
mkdir -p $LOGFILE
 
UTIL1=$(mpstat -u|grep -Ev "Linux|%" | sed '/^$/d' | cut -c 21-24)
 
echo $UTIL1
echo $LIMIT
 
if [ "$UTIL1" -gt "$LIMIT" ]
then 
    echo "Current CPU Utilization = $UTIL3" >> $LOGFILE/cpuutil.log
    echo "CPU Threshold = $LIMIT" >> $LOGFILE/cpuutil.log
#    mail -s "CPU Utilization on $hostname is over CPU Threshold" $ADMINS < $LOGFILE/cp
uutil.log
#    scp $LOGFILE/cpuutil.log root@headnode:/mnt/disk01/alerts/cpu/
    rm -f $LOGFILE/cpuutil.log
fi

Open in new window

0
 
LVL 84

Accepted Solution

by:
ozo earned 125 total points
ID: 24307195
-gt only compares integers, not values with 2 decimal places
you can use a different function for comparing, such as awk "BEGIN{exit $UTIL1 < $LIMIT}"
or, if it is always exactly 2 decimal places, you can convert it to an integer by removing the  .
0
 

Author Comment

by:dpoper1
ID: 24307226
It worked thanks a million, I have changed the LIMIT value to test out the script.

Thanks once again.

Regards,

Michael

#!/bin/bash
 
#LIMIT="50.01"
LIMIT="0.3"
ADMINS=myemail@gmail.com
LOGFILE=/var/log/monitoring/cpu
 
mkdir -p $LOGFILE
 
UTIL1=$(mpstat -u|grep -Ev "Linux|%" | sed '/^$/d' | cut -c 21-24)
 
#echo $UTIL1
#echo $LIMIT
 
#if [ "$UTIL1" -gt "$LIMIT" ]
if awk "BEGIN{exit $UTIL1 < $LIMIT}"
then 
    echo "Current CPU Utilization = $UTIL1" >> $LOGFILE/cpuutil.log
    echo "CPU Threshold = $LIMIT" >> $LOGFILE/cpuutil.log
    mail -s "CPU Utilization on $hostname is over CPU Threshold" $ADMINS < $LOGFILE/cpu
util.log
#    scp $LOGFILE/cpuutil.log root@headnode:/mnt/disk01/alerts/cpu/
    rm -f $LOGFILE/cpuutil.log
fi

Open in new window

0

Featured Post

Visualize your virtual and backup environments

Create well-organized and polished visualizations of your virtual and backup environments when planning VMware vSphere, Microsoft Hyper-V or Veeam deployments. It helps you to gain better visibility and valuable business insights.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Ubuntu Apache Webserver - File Permissions 5 76
replacing file name with spaces in ibm aix. 2 34
Shell Script- gzip 5 50
Certificate Request CentOS/Apache 1 23
If you have a server on collocation with the super-fast CPU, that doesn't mean that you get it running at full power. Here is a preamble. When doing inventory of Linux servers, that I'm administering, I've found that some of them are running on l…
Utilizing an array to gracefully append to a list of EmailAddresses
Learn how to find files with the shell using the find and locate commands. Use locate to find a needle in a haystack.: With locate, check if the file still exists.: Use find to get the actual location of the file.:
Get a first impression of how PRTG looks and learn how it works.   This video is a short introduction to PRTG, as an initial overview or as a quick start for new PRTG users.

733 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question