shell write a script hardware monitor system memory cpu

Monitor memory, cpu, hard disk, cpu utilization check within 5 seconds
monitor_system.sh

#!/bin/bash

arr=()
disks="/dev/sda2 /dev/sdb1"
time=$(date "+%Y-%m-%d %H:%M:%S")
echo $time

MEM_USAGE=`free|grep Mem|awk '{print ($2-$7)/$2}'`
arr[${#arr[*]}]=${MEM_USAGE}
echo "MEM Usage:"`echo ${MEM_USAGE}|awk '{printf "%.2f", $1*100}'`"%"

TIME_INTERVAL=5
LAST_CPU_INFO=$(cat /proc/stat | grep -w cpu | awk '{print $2,$3,$4,$5,$6,$7,$8}')
LAST_SYS_IDLE=`echo $LAST_CPU_INFO | awk '{print $4}'`
LAST_TOTAL_CPU_T=`echo $LAST_CPU_INFO | awk '{print $1+$2+$3+$4+$5+$6+$7}'`
sleep ${TIME_INTERVAL}
NEXT_CPU_INFO=$(cat /proc/stat | grep -w cpu | awk '{print $2,$3,$4,$5,$6,$7,$8}')
NEXT_SYS_IDLE=`echo $NEXT_CPU_INFO | awk '{print $4}'`
NEXT_TOTAL_CPU_T=`echo $NEXT_CPU_INFO | awk '{print $1+$2+$3+$4+$5+$6+$7}'`

SYSTEM_IDLE=$((${NEXT_SYS_IDLE}-${LAST_SYS_IDLE}))
TOTAL_TIME=$((${NEXT_TOTAL_CPU_T}-${LAST_TOTAL_CPU_T}))
CPU_USAGE=`echo ${SYSTEM_IDLE} ${TOTAL_TIME}|awk '{print 1-$1/$2}'`
arr[${#arr[*]}]=${CPU_USAGE}
echo "CPU Usage:"`echo ${CPU_USAGE}|awk '{printf "%.2f", $1*100}'`"%" 

for disk in ${disks};
do
c=`df -l | grep ${disk} | awk '{print $3/$2}'`
arr[${#arr[*]}]=${c}
echo "DISK ${disk} Usage:"`echo ${c}|awk '{printf "%.2f", $1*100}'`"%"
done

echo ${arr[@]} >> $1 

exit 0

Per minute statistical look to see which indicators exceed the limit
loop_monitor_system.sh

#!/bin/bash

DISK_LEVEL=0.7 # 70%
CPU_LEVEL=0.7 # 70%
MEM_LEVEL=0.7 # 70%

logname="/tmp/monitor_system.log"
>${logname}

end_t=`date -d "55sec" +%s`

while [ $(date +%s) -le ${end_t} ];
do
./monitor_system.sh $logname
done

disk_num=`cat ${logname}|head -1|awk '{print NF-2}'`
avg_mem=`cat ${logname}|awk '{sum+=$1}END{print sum/NR}'`
avg_cpu=`cat ${logname}|awk '{sum+=$2}END{print sum/NR}'`

#echo ${avg_mem} ${avg_cpu}
if [ $(echo "${avg_mem}>${MEM_LEVEL}" | bc) = 1 ];then
echo 'mem to high:'`echo ${avg_mem}|awk '{print $1*100}'`
fi
if [ $(echo "${avg_cpu}>${CPU_LEVEL}" | bc) = 1 ];then
echo 'cpu to high:'`echo ${avg_cpu}|awk '{print $1*100}'`
fi
 
for((i=1;i<=${disk_num};i++));
do
 j=$((${i}+2))
 avg_disk=`cat ${logname}|awk '{sum+=$'${j}'}END{print sum/NR}'`
 if [ $(echo "${avg_disk}>${DISK_LEVEL}" | bc) = 1 ];then
  echo 'disk to high:'`echo ${avg_disk}|awk '{print $1*100}'`
 fi
 #echo ${avg_disk}
done

exit 0
Published 70 original articles · won praise 56 · views 20000 +

Guess you like

Origin blog.csdn.net/zhangenter/article/details/103428182