JVM异常诊断(二)、脚本

在上文介绍的基础上,我们写了个简单的小脚本,大致步骤如下

    1.通过名称获取进程Id
    2.循环获取进程内线程的执行情况
    3.筛选出耗用大于30%的线程
    4.获取线程栈信息
#!/bin/bash
#进程ID
processName = ''
x=  ps -ef | grep ${processName} | grep -v grep| awk '{print $2}';
#echo $x;
#循环五次,记录每次的前20名线程cpu耗用
for i in {1..5};do

    y= ps -ef | grep  ${processName} | grep -v grep| awk '{print $2}'|xargs top -b -n 1 -H -p |grep PID -A 20|awk  '{print $1"\t"$9"\t"$11}'> stack.res;
    #echo | awk  '{print z}' z="$y";

#将线程ID 和 cpu耗用时间存在数组中
    PIDArr=($(awk '{print $1}' stack.res));
    CPUArr=($(awk '{print $2}' stack.res));
    MEMArr=($(awk '{print $3}' stack.res)); 

#选出每次top出的大于30的线程
    len=${#CPUArr[@]}
    for((i=1;i<len;++i))
    do

         c=`echo "${CPUArr[$i]}"|awk 'BEGIN{FS="."} {print $1}'` 
        if [ $c -le 10  ]; then
               unset CPUArr[$i]
               unset PIDArr[$i]
               unset MEMArr[$i]
        fi
    done
#打印出结果

    echo ${PIDArr[@]}
    echo ${CPUArr[@]}
    echo ${MEMArr[@]}
    echo ""
    sleep 1

done;
 ps -ef | grep  ${processName}| grep -v grep| awk '{print $2"\t"$1}' > pid.res
 #PID = ($(awk '{print $1}' pid.res));
 #echo $PID
#打印出最终线程栈
len=${#PIDArr[@]}
for((i=1;i<len;++i))
do
    d=`echo "${PIDArr[$i]}"|awk '{printf("%x\n",$0)}'`
    echo ${PIDArr[$i]};
    echo $d
    /usr/java/jdk1.7.0_55/bin/jstack $(awk '{print $1}' pid.res)|grep $d -A 50  
done

发表评论

邮箱地址不会被公开。 必填项已用*标注