Javaアプリケーションのパフォーマンス解析で使用するJDK Flight Recorder(JFR)をファイルにファイルに出力するシェルスクリプトのサンプルです。このシェルではTomcatのJVMからJFRダンプを取得し、ログディレクトリへファイルを保存します。
#!/bin/bash
# TomcatのJVM PIDを取得
PID=$(jps -l | grep 'org.apache.catalina.startup.Bootstrap' | awk '{print $1}')
# PIDが取得できなければ終了
if [ -z "$PID" ]; then
echo "TomcatのPIDが見つかりません。"
exit 1
fi
# 保存先ディレクトリ
OUT_DIR="/opt/tomcat10/logs"
# 出力先ディレクトリがない場合はディレクトリを作成
if [ ! -d "$OUT_DIR" ]; then
mkdir -p "$OUT_DIR"
fi
# タイムスタンプ付きファイル名
FILENAME="$OUT_DIR/flight_$(date +%Y%m%d_%H%M%S).jfr"
# JFRダンプ実行
jcmd "$PID" JFR.dump name=1 filename="$FILENAME"
メリット
・TomcatのPIDを自動で取得でき、手動で確認する手間が省けます。
・出力先ディレクトリが存在しない場合でも、自動で作成されるため柔軟です。
・タイムスタンプ付きでファイルが保存され、ログの管理が容易になります。
デメリット
・jps や jcmd が使えない環境(最小構成のJREなど)では動作しません。
・JFRが無効化されている場合、事前に有効化設定が必要です。
・Tomcatを複数インスタンス起動している環境では、対象PIDの判別に工夫が必要です。
cronの設定
crontabを使用することでシェルの定期実行が可能です。
次のような設定をすることで5分に1回JFRをファイルに出力することが可能です。
*/5 * * * * /root/jfr/jfr_out.sh > /dev/null 2>&1
取得頻度は環境に合わせてカスタマイズしてください。