Script to capture top 10 CPU usage

#!/bin/ksh
#################################################################################################
#  Program:     cpu_utilization.ksh                                                             #
#  Author:      Panchamoorthy Marimuthu                                                         #
#  Purpose:     (1) To capture top 10 CPU usage when idle percentage less or equal to 30        #
#                                       along with process proctree information                 #
#  Called By:   Cron                                                                            #
#  Calls:       N/A                                                                             #
#  Parameters:                                                                                  #
#################################################################################################

# Redirection of vmstat and cpu top 10 process information to a file in /tmp directory
vmstat 2 2 >/tmp/vmstat_util
ps aux | sort -rn +2 | head > /tmp/top_cpu_util
tail -1 /tmp/vmstat_util > /tmp/vmstat_out

# Create a directory if does not exist
if [ ! -d "$DIRECTORY" ];
then
mkdir -p /work/cpu
fi

# Variables Deceleration
dt=`date +%F`
HOUR_MIN_SEC=`/usr/bin/date +%T`
SERVER_NAME=`/usr/bin/uname -n`
SERVER_DAYS=`uptime |awk '{print $3,$4}' |awk -F "," '{print $1}'`
DIRECTORY=/work/cpu
FILE_VMSTAT=$DIRECTORY/$SERVER_NAME-vmstat-$dt
FILE_CPU=$DIRECTORY/$SERVER_NAME-CPU-$dt

header="%-8s %2s %2s %5s %7s %5s %4s %4s %3s %3s %3s %4s %4s %5s %5s %5s %5s %5s %5s %5s\n"
vmstat_value="%-8s %2s %2s %5s %7s %3s %4s %4s %3s %3s %3s %4s %4s %5s %5s %5s %5s %5s %5s %5s\n"

# Print header information
if [ ! -e "$FILE_VMSTAT" ];
then
printf "$header" "TIMING" "r" "b" "avm" "fre" "re" "pi" "po" "fr" "sr" "cy" "in" "sy" "cs" "us" "sy" "id" "wa" "pc" "ec" >$FILE_VMSTAT
fi

cpu_idle=`awk '{print $16}' /tmp/vmstat_out`
vmstat_lcpu=`awk -F ' ' 'FNR == 2 {print $3}' /tmp/vmstat_util | cut -d '=' -f2`

read vmstat_r vmstat_b vmstat_avm vmstat_fre vmstat_re vmstat_pi vmstat_po vmstat_fr vmstat_sr vmstat_cy vmstat_in vmstat_sy vmstat_cs vmstat_us vmstat_sy vmstat_id vmstat_wa vmstat_pc vmstat_ec < /tmp/vmstat_out

# Print vmstat variable along with timestamp
printf "$vmstat_value" $HOUR_MIN_SEC $vmstat_r $vmstat_b $vmstat_avm $vmstat_fre $vmstat_re $vmstat_pi $vmstat_po $vmstat_fr $vmstat_sr $vmstat_cy $vmstat_in $vmstat_sy $vmstat_cs $vmstat_us $vmstat_sy $vmstat_id $vmstat_wa $vmstat_pc $vmstat_ec >> $FILE_VMSTAT

# Condition to check CPU idle threshold level and then print detailed CPU information
if [ "$cpu_idle" -le 99 ]; then
echo SERVER NAME: $SERVER_NAME >> $FILE_CPU
echo SERVER UPTIME: $SERVER_DAYS >> $FILE_CPU
echo LOGICAL PROCESSORS: $vmstat_lcpu >> $FILE_CPU
echo RUN QUEUE: $vmstat_r >> $FILE_CPU
echo BLOCK QUEUE: $vmstat_b >> $FILE_CPU
echo USER: $vmstat_us >> $FILE_CPU
echo SYSTEM: $vmstat_sy >> $FILE_CPU
echo IDLE: $vmstat_id >> $FILE_CPU
echo WAIT IO: $vmstat_wa >> $FILE_CPU
echo ENTITLED CAPACITY: $vmstat_ec >> $FILE_CPU
echo TIMESTAMP: $HOUR_MIN_SEC >> $FILE_CPU
echo "---------------------------------------------------------------------------------------------------------" >> $FILE_CPU
ps aux | head -1 >> $FILE_CPU
cat /tmp/top_cpu_util >> $FILE_CPU
echo "\n" >> $FILE_CPU
awk '!/wait/ {print $2}' /tmp/top_cpu_util | while read x; do proctree $x; echo " "; done >> $FILE_CPU
echo "\n" >> $FILE_CPU
fi

echo "=================================================================================================================" >> $FILE_CPU

# Removal of temporary files created under /tmp directory
rm /tmp/vmstat_util
rm /tmp/vmstat_out
rm /tmp/top_cpu_util

#Log rotation for every 90 days
find $DIRECTORY -type f -mtime +90 -print -exec rm -f {} \;