プロセスの PID を記録してデーモンの起動と終了を行うといった Unix 系のサーバで一般的に行われている手法を Java VM で行うためなどに VM のプロセス ID が取れたらと何時も思っておりましたが、実際にやろうと思うと JNI を使用して環境ごとのネイティブライブラリを作らなければならなかったりと一々面倒です。
たまたま JMX (Java Management Extensions) を使ってサーバ管理系の MXBean などを作っておりましたところプロセス ID らしきものが目についたのでここにメモしておきます。やり方は簡単、RuntimeMXBean
を使用するだけです。
import java.lang.management.*; RuntimeMXBean rt = ManagementFactory.getRuntimeMXBean(); String name = rt.getName(); if(name.matches("\\d+@.*")){ pid = Integer.parseInt(name.substring(0, name.indexOf('@'))); } else { // 取得できなかった場合 pid = -1; }
上記のように RuntimeMXBean#getName()
は "pid@hostname"
という形式の文字列を返しますので解析してプロセス ID を取り出すことができます。もちろん環境依存の挙動であるためすべての実行環境でうまく取得できる保証はありませんが、特定の環境向け開発だとか、ネイティブライブラリを用意するのはこの方法がうまく行かなかった環境だけと割り切るだけでも楽かと思います。
手元で確認できた環境は以下の通り。他にあればコメントなどに残しておいてもらえると助かります。
- Oracle JDK 1.6.0_26 (CentOS 5.6 final)
- Oracle JDK 1.6.0_24 (Windows XP)
- Apple JDK 1.6.0_26 (MacOSX 10.5)
2011/07/17 (日) 14:15 | システム開発 | トラックバック(0) | コメント(0) | 編集