用jstack自动化捕抓异常java代码脚本

#!/bin/bash

date=` date +%y%m%d-%H%M`

pgrep 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