#!/bin/bash
date=` date +%y%m%d-%H%M`
pid=`top -bn1 |grep java | awk '{print $1 "\t" $9}' |head -1 | cut -f 1`
pidCPU=`top -bn1 |grep java | awk '{print $1 "\t" $9}' |head -1 | cut -f 2`
# java home
if test -z $JAVA_HOME #est -z $JAVA_HOME 是一个判断表达式,用于判断$JAVA_HOME的值是否为空字符串
then
JAVA_HOME='/data/services/jdk1.7.0_79/'
fi
# checking pid
if test -z "$($JAVA_HOME/bin/jps -l | cut -d '' -f 1 | grep $pid)" #jps -l可以列出本机所有java进程的pid,cut -d只切割pid这一列。
then
echo "process of $pid is not exists" #查找我们要找的进程是否存在
exit
fi
#line number
if test -z $linenum #判断linenum是否为空字符串,来定义打印多少行
then
linenum=10
fi
stackfile=stack$pid.dump #查异常代码文件
threadsfile=threads$pid.dump #线程id
# generate java stack
$JAVA_HOME/bin/jstack -l $pid >> $stackfile #用jstack把异常代码输入到参数文件$pidpid.dump里面去
ps -mp $pid -o THREAD,tid,time | sort -k2r | awk '{if ($1 !="USER" && $2 != "0.0" && $8 !="-" && $9) print "线程号:"$8 "; CPU负载:" $2;}' >threadsfile.txt #查找出满足第一列是>否为USER&&第二列是否为空值&&第八列是否为-的话就输出第八列的pid保存到threadsfile.txt文件内
ps -mp $pid -o THREAD,tid,time | sort -k2r | awk '{if ($1 !="USER" && $2 != "0.0" && $8 !="-" && $9) print $8;}' | xargs printf "%x\n" >> $threadsfile #ps -mp命令是在当前用户下>,列出pid包含的所有线程,本地id,时间,sort 的选项k2是指定第2排序的栏位,r是倒序排列,{if ($1 !="USER" && $2 != "0.0" && $8 !="-") print $8;}是满足第一列是否为USER&&第二列是否为>空值&&第八列是否为-的话就输出第八列的pid,然后打印出来并转成16进制输出到threads$pid.dump文件
tids="$(cat $threadsfile)" #设置tids变量为threads$pid.dump文件
for tid in $tids #然后循环打印出来我们要找的异常代码
do
echo "------------------------------ ThreadId (进程号为:$pid;CPU线程号十六进制为:$tid;) ------------------------------"
cat $stackfile | grep 0x$tid -A $linenum
done
参考 http://www.javatang.com