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.......