Java 9のProcess APIでプロセスツリーをトラバースする方法
Java 9ではProcess APIが大幅に改善され、オペレーティングシステム(OS)のプロセスをJavaプログラムから簡単に管理・制御できるようになりました。Java 9以前は、JavaプログラムからOSプロセスを操作することは非常に困難でしたが、Java 9以降はプロセス制御のための新しいクラスやインターフェースが追加されています。
具体的には、ProcessHandleやProcessHandle.Infoといった新しいインターフェースが導入され、既存のProcessクラスにも新しいメソッドが追加されました。
以下の例では、Process APIを使用してプロセスツリー(子プロセスと子孫プロセス)をトラバース(走査)する方法を紹介します。
コード例
import java.io.IOException;
public class ProcessTreeTest {
public static void main(String args[]) throws IOException {
Runtime.getRuntime().exec("cmd");
System.out.println("子プロセスの表示:");
ProcessHandle processHandle = ProcessHandle.current();
processHandle.children().forEach(childProcess ->
System.out.println("PID: " + childProcess.pid()
+ " Command: " + childProcess.info().command().get()));
System.out.println("子孫プロセスの表示:");
processHandle.descendants().forEach(descendantProcess ->
System.out.println("PID: " + descendantProcess.pid()
+ " Command: " + descendantProcess.info().command().get()));
}
}
実行結果
子プロセスの表示: PID: 5092 Command: C:\WINDOWS\System32\cmd.exe 子孫プロセスの表示: PID: 5092 Command: C:\WINDOWS\System32\cmd.exe PID: 2256 Command: C:\WINDOWS\System32\conhost.exe
主なメソッドのポイント
- ProcessHandle.current():現在実行中のプロセス(このJavaアプリケーション自身)のハンドルを取得します。
- children():直接の子プロセスのみを含むストリームを返します。
- descendants():子プロセスだけでなく、その先のすべての子孫プロセスを再帰的に取得します。
- pid():プロセスID(PID)をlong値として返します。
- info().command():プロセスの実行コマンドのフルパスをOptional型で返します。
なお、この例はWindows環境での実行を想定しています。LinuxやmacOSで実行する場合は、exec()に渡すコマンドを「/bin/sh」など環境に合わせて変更してください。
-
Windows 10でプロセスを強制終了する方法|タスクマネージャー・コマンド・ツール別に徹底解説
パソコンの動作が遅くなったり、不要なアプリ(ブロートウェア)がリソースを大量に消費していたりする場合、原因となっているプロセスを強制終了させるのが最も効果的な対処法です。 プロセスを終了することでPCのパフォーマンスが向上するだけでなく、スパイウェアやウイルスの被害を未然に防ぐことにもつながります。「Windows 10でプロセスを強制終了するのは難しいのでは?」と心配する必要はありません。この記事では、安全かつ簡単にプロセスを終了できるさまざまな方法を詳しく解説します。 Windows 10でプロセスを強制終了すべき理由 Windows上で動作している各アプリケーションは、1つ以上
-
Java 9のProcessBuilderを使ってプロセスを作成・管理する方法
Java 9では、Process APIが強化され、新たにProcessHandleインターフェースが追加されました。ProcessHandleのインスタンスはローカルプロセスを識別し、プロセスの状態(ステータス)の照会やプロセス管理を可能にします。従来はローカルプロセスのPIDを取得するためにネイティブコードが必要でしたが、ProcessHandle.Infoを使えば、その必要なくPIDやその他のプロセス情報を簡単に取得できるようになりました。 ProcessBuilderクラスは、オペレーティングシステム上で独立したプロセスを作成するために使用されるクラスです。以下の例では、Process