tanamonの稀に良く書く日記

KEEP CALM AND DRINK BEER

JDK5で各種ダンプを取るシェルスクリプト

世はJDK6の時代ですが、JDK5の環境でデッドロックなんぞが起こってしまったので急遽ダンプを取るなどした。jmapやjstackのオプションがJDK6から便利になりすぎてて少し泣いた。
あと、会社のPCのHDDが死にそうで、こっちはマジにビビリながら作業した。

dump.sh

#!/bin/bash

JDK_HOME=$ORACLE_HOME/jdk
OC4J_INSTANCE=$1
OC4J_STDOUT=$ORACLE_HOME/opmn/logs/$OC4J_INSTANCE~$OC4J_INSTANCE~default_group~1.log

# parametor check.
if [ "$OC4J_INSTANCE" = "" ]; then
  echo "usage: $0 <oc4j_instance_name>"
  exit
fi

# java process check.
PID=`$JDK_HOME/bin/jps -v | grep $OC4J_INSTANCE | awk '{print $1}'`
if [ "$?" != "0" -o "$PID" = "" ]; then
  echo "instance '$OC4J_INSTANCE' is not found."
  exit
fi

DUMP_HOME=/tmp/dump/$PID
mkdir -p $DUMP_HOME

# Info dump.
echo "Info dump."
$JDK_HOME/bin/jinfo $PID > $DUMP_HOME/jinfo.log

# Heap dump(JDK5).
echo "Heap dump."
$JDK_HOME/bin/jmap -heap:format=b $PID
mv heap.bin $DUMP_HOME/

# Heap dump(JDK6).
# $JDK_HOME/bin/jmap -dump:file=heap.bin $PID

# Threads dump(JDK5).
echo "Threads dump."
tail -n 0 -f $OC4J_STDOUT > $DUMP_HOME/threads.log &
sleep 1
kill -3 $PID
sleep 15
kill -9 `jobs -l | awk '{print $2}'`

# Threads dump(JDK6).
# $JDK_HOME/bin/jstack -l $PID > $DUMP_HOME/threads.log

JDK6に移行しても使えるようにJDK6的なやり方をコメントに書いているけど、試していないので動くかは不明(その環境がJDK6に移行したら試す)。あと、Oracle Application Serverのことしか考えていない。


heap.binが決め打ちなので移動させたり、JDK5のjstackはロック情報を出すオプションが無いので怪しいスレッドダンプの取り方をしてたり、とにかくなんだかカオスです。