Top utilization of the users through script

I am trying for a shell script like, if the ram utilization is less than 300M and the load average is more then 4.00 , should take all the top users of memory and CPU utilization through "top" and "ps " command and put under one path.

Hi,

You'll have to be a bit clearer about your requirements here, I'm not sure what you mean by "under one path".

Dave

Hi Dave,

I want the output to be stored under destination path.

Do you mean stored in a file ?

yes... Later I can view those file and see which user consumes more mem and cpu. .

Maybe the following script (for the Solaris and Linux) is useful for you.

#!/bin/sh
set -f
PATH=/usr/xpg4/bin:/usr/bin:/bin:/usr/sbin:/usr/ucb
export PATH
 
if [ -x /usr/sbin/swap ]; then
 vmempct=`swap -s |
 awk '{gsub("([0-9])k","\1"); print int($9*100/($11+$9))}'
 `
else
 # deduct some cached data because it is easily reclaimable
 # 17.06.2014 changed f=2 to f=1.51
 vmempct=`free |
 awk '/^[Mm]em/ {used+=$3; eused+=$3-($6+$7)/f; free+=$4} /^[Ss]wap/ {used+=$3; eused+=$3; free+=$4} END {print int(eused*100/(free+used))}' f=1.51
 `
fi
printf "%-10s %2d %%\n" "#vmemory:" $vmempct
load=`uptime | awk '{sub(".*[Ll]oad[^0-9]*",""); sub("[^0-9.].*$",""); print $0*100}'`
if [ -f /proc/cpuinfo ]; then
 cores=`grep -ic '^processor' /proc/cpuinfo`
 scaleps=$cores # ps pcpu is per vcpu
else
 cores=`psrinfo | grep -c .`
 # With regards to CMT system throughput, put a p=1/2 factor
 case `uname -i` in
 SUNW,*T[125][0-9][0-9]*) cores=`expr \( $cores + 1 \) / 2`
 ;;
 esac
 scaleps=1 # ps pcpu is per total
fi
printf "%-10s %2d %%\n" "#cpu:" `expr $load / $cores`
disk=`df -k / /tmp /var/tmp /var /opt | awk '{sub("%$","",$5)} $5+0>max {max=$5} END {print max+0}'`
printf "%-10s %2d %%\n" "#disk:" $disk
#assume 8 users per core maximum:
users | awk 's[$1]++==0 {++users} END {
printf "%-10s %-4d , %2d %%\n","#users:",users,users*100/8/cores
}' RS=" " cores=$cores
#assume 24000 processes maximum (Solaris default pidmax=30000) and 30000 threads maximum (Linux default pid_max=32768)
ps -Le -o pid= |
 awk 's[$1]++==0 {proc++} END {
printf "%-10s %-4d , %2d %%\n","#procs:",proc,proc*100/24000
printf "%-10s %-4d , %2d %%\n","#threads:",NR,NR*100/30000
}'
#assume 3000 ttys maximum
ttys=`who | grep -c .`
printf "%-10s %-4d , %2d %%\n" "#ttys:" $ttys `expr $ttys \* 100 / 3000`
#all in one variable:
allprocs=`ps -e -o uid= -o pcpu= -o vsz= -o rss=`
#assume 600 processes maximum:
echo "#procs per user, top 3:"
echo "$allprocs" |
 awk '{s[$1]++} END {for(i in s) print i,s,int(s*100/600)}' |
 sort -nr -k 2,2 |
 head -3 |
 while read a b c
 do
  a=`getent passwd $a | cut -f1 -d:`
  printf " %-9s %-4d , %2d %%\n" $a $b $c
 done
#assume 3000 threads maximum:
echo "#threads per user, top 3:"
ps -Le -o uid= |
 awk '{s[$1]++} END {for(i in s) print i,s,int(s*100/3000)}' |
 sort -nr -k 2,2 |
 head -3 |
 while read a b c
 do
  a=`getent passwd $a | cut -f1 -d:`
  printf " %-9s %-4d , %2d %%\n" $a $b $c
 done
echo "#cpu% per user, top 3:"
echo "$allprocs" |
 awk '{s[$1]+=$2} END {for(i in s) print i,s/c}' c=$scaleps |
 sort -nr -k 2,2 |
 head -3 |
 while read a b
 do
  a=`getent passwd $a | cut -f1 -d:`
  printf " %-9s %2.1f\n" $a $b
 done
echo "#vmemoryMB per user, top 3:"
echo "$allprocs" |
 awk '{s[$1]+=$3} END {for(i in s) print i,s/1024}' |
 sort -nr -k 2,2 |
 head -3 |
 while read a b
 do
  a=`getent passwd $a | cut -f1 -d:`
  printf " %-9s %4.1f\n" $a $b
 done
echo "#residentMB per user, top 3:"
echo "$allprocs" |
 awk '{s[$1]+=$4} END {for(i in s) print i,s/1024}' |
 sort -nr -k 2,2 |
 head -3 |
 while read a b
 do
  a=`getent passwd $a | cut -f1 -d:`
  printf " %-9s %4.1f\n" $a $b
 done

Thanks a lot.......