AutoJstack.sh

  运维
#!/bin/bash


DATE=$(date +%y%m%d%H%M%S)
stackfile=~/stackfile"$DATE".txt    #jstack file locate.
threadfile=~/threadfile"$DATE".txt  #thread file locate.

SysTouchPeriod=5                #period of loop.(seconds)
CpuTouchTimePeriod=0.5              #inner para,to define two cpu time slice.(seconds)
LimitMemUsedRate=50             #max allowed memory used,included but without %.
LimitCpuUsedRate=80             #max allowed cpu used,included but without %.   
CurentMemUsedRate=""                #global init para.
CurentCpuUsedRate=""                #global init para.

#to exec jstack single Bootstrap
function jstackCtpid(){
    ctpidname=$(jps -l|grep Bootstrap)      #key pid name       
    ctpid=${ctpidname% *}
    jstack $ctpid >>$stackfile
    #top -n1bHc -p $ctpid>>$threadfile
    ps p $ctpid -L -o pcpu,pid,tid,time,tname,stat,psr | sort -n -k1 -r >>$threadfile
}


function getMemUsedRate(){
    LoadMemory=$(cat /proc/meminfo | awk '{print $2}')
    Total=$(echo $LoadMemory | awk '{print $1}')
    Free1=$(echo $LoadMemory | awk '{print $2}')
    Free2=$(echo $LoadMemory | awk '{print $3}')
    Free3=$(echo $LoadMemory | awk '{print $4}')

    Used=`expr $Total - $Free1 - $Free2 - $Free3`
    Used_Rate=`expr  $Used/$Total*100 | bc -l`
    CurentMemUsedRate=`expr "scale=3; $Used_Rate/1.0" |bc`  
}


function getCpuUsedRate(){
    CPULOG_1=$(cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}')
    SYS_IDLE_1=$(echo $CPULOG_1 | awk '{print $4}')
    Total_1=$(echo $CPULOG_1 | awk '{print $1+$2+$3+$4+$5+$6+$7}')

    sleep $CpuTouchTimePeriod

    CPULOG_2=$(cat /proc/stat | grep 'cpu ' | awk '{print $2" "$3" "$4" "$5" "$6" "$7" "$8}')
    SYS_IDLE_2=$(echo $CPULOG_2 | awk '{print $4}')
    Total_2=$(echo $CPULOG_2 | awk '{print $1+$2+$3+$4+$5+$6+$7}')

    SYS_IDLE=`expr $SYS_IDLE_2 - $SYS_IDLE_1`
    Total=`expr $Total_2 - $Total_1`
    CurentCpuUsedRate=`expr "scale=3; 100-$SYS_IDLE/$Total*100" |bc -l`
}

while :
do
    ctpidname=$(jps -l|grep Bootstrap)      #key pid name       
    if [ "$ctpidname" =  "" ]; then
        echo no process found!
        sleep $SysTouchPeriod
        continue
    fi
    getMemUsedRate;
    getCpuUsedRate;
    if [ `echo "$CurentMemUsedRate > $LimitMemUsedRate" | bc` -eq 1 ]||[ `echo "$CurentCpuUsedRate > $LimitCpuUsedRate" | bc` -eq 1 ]; then
        jstackCtpid;
    fi  
    sleep $SysTouchPeriod
done

LEAVE A COMMENT

发表评论前,请选对水果【Apple=苹果、Banana=香蕉、Pineapple=菠萝、Grapes=葡萄】 Grapes...