在上文介绍的基础上,我们写了个简单的小脚本,大致步骤如下
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