広告

Java : ProcessHandle.Info (外部プロセス情報) - API使用例

ProcessHandle.Info (Java SE 19 & JDK 19) の使用例まとめです。
だいたいのメソッドを網羅済みです。
API仕様のおともにどうぞ。


概要

プロセスに関する情報スナップショット。 プロセスの属性はオペレーティング・システムによって異なり、すべての実装で利用できるわけではありません。 プロセスに関する情報は、リクエストを行うプロセスのオペレーティング・システム特権によって制限されます。

クラス構成

ProcessHandle.Info インタフェースは、ProcessProcessHandle オブジェクトから取得できます。
そして ProcessHandle.Info からは、

  • 外部プロセスを実行したユーザ
  • 使用したCPU時間

といったプロセスに関する情報にアクセスできます。

public class Main {
    public static void main(String[] args) {
        final var handle = ProcessHandle.current();
        final var info = handle.info();
        System.out.println("user = " + info.user());
        System.out.println("total cpu time = " + info.totalCpuDuration());
    }
}

// 結果
// ↓
//> java Main
//user = Optional[MY-PC\xxxx]
//total cpu time = Optional[PT0.09375S]

メソッド

Optional<String[]> arguments ()

プロセスの引数の文字列の配列を返します。

※Linux で実行した結果です。

public class Main {
    public static void main(String[] args) {
        System.out.println("args : " + Arrays.toString(args));

        final var handle = ProcessHandle.current();
        final var info = handle.info();

        info.command().ifPresent(command -> {
            System.out.println("command = " + command);
        });
        info.commandLine().ifPresent(commandLine -> {
            System.out.println("commandLine = " + commandLine);
        });
        info.arguments().ifPresent(arguments -> {
            System.out.println("arguments = " + Arrays.toString(arguments));
        });
    }
}

// 結果
// ↓
//$ java Main aaa bbb
//args : [aaa, bbb]
//command = /home/xxxx/openjdk/jdk-19.0.2/bin/java
//commandLine = /home/xxxx/openjdk/jdk-19.0.2/bin/java Main aaa bbb
//arguments = [Main, aaa, bbb]

Optional<String> command ()

プロセスの実行可能パス名を返します。

このメソッドの使用例は、arguments() にまとめて記載しました。
そちらのAPI使用例をご参照ください。

Optional<String> commandLine ()

プロセスのコマンドラインを返します。

このメソッドの使用例は、arguments() にまとめて記載しました。
そちらのAPI使用例をご参照ください。

Optional<Instant> startInstant ()

プロセスの開始時間を返します。

public class Main {
    public static void main(String[] args) {
        System.out.println("current time : " + Instant.now());

        // 約15秒 CPU時間を使います。
        final var start = System.nanoTime();
        while (true) {
            if (System.nanoTime() - start >= 1000000000L * 15) {
                break;
            }
        }

        final var handle = ProcessHandle.current();
        final var info = handle.info();

        info.startInstant().ifPresent(instant -> {
            System.out.println("start instant = " + instant);
        });
        info.totalCpuDuration().ifPresent(duration -> {
            System.out.println("total cpu time = " + duration);
        });
    }
}

// 結果
// ↓
//> java Main
//current time : 2023-03-25T07:52:44.806974500Z
//start instant = 2023-03-25T07:52:44.727Z
//total cpu time = PT14.828125S

Optional<Duration> totalCpuDuration ()

プロセスの合計cputimeを返します。

このメソッドの使用例は、startInstant() にまとめて記載しました。
そちらのAPI使用例をご参照ください。

Optional<String> user ()

プロセスのユーザーを返します。

public class Main {
    public static void main(String[] args) {
        final var handle = ProcessHandle.current();
        final var info = handle.info();
        info.user().ifPresent(user -> {
            System.out.println("user = " + user);
        });
    }
}

// 結果
// ↓
//> java Main
//user = MY-PC\xxxx

関連記事

ページの先頭へ