Java 9のProcess APIでプロセスのすべての子プロセスを取得する方法
Java 9のProcessHandleインターフェースとは
Java 9では、OS上のプロセスを扱うための新しいクラスとAPIが導入されました。ProcessHandleインターフェースとその関連メソッドを利用することで、プロセスID(PID)や、親プロセス・子プロセスといった関連プロセスの詳細情報を簡単に取得できます。
あるプロセスのすべての子プロセスを取得したい場合は、java.lang.ProcessHandle.children()メソッドを使用します。このメソッドは、直接の子プロセスのスナップショットをStreamとして返します。なお、子プロセスを持たないプロセスに対しては、空のストリームが返される点に注意してください。
また、info()メソッドから取得できるProcessHandle.Infoオブジェクトを通じて、実行コマンド(command())などの情報へアクセスできます。アクセス権限などの理由で情報を取得できない場合は、Optional.empty()が返されます。
コード例
次の例では、システム上で動作している最初のプロセスを取得し、その子プロセスのPIDとコマンド情報を出力します。
import java.util.stream.Stream;
import java.util.Optional;
public class ChildrenProcessTest {
public static void main(String args[]) throws InterruptedException {
System.out.println("---------------------------");
System.out.println("子プロセスの一覧:");
Optional<ProcessHandle> processHandle = ProcessHandle.allProcesses().findFirst();
processHandle.ifPresent(proc ->
proc.children().forEach(child ->
System.out.println("PID: [ " + child.pid()
+ " ]、コマンド: [ " + child.info().command() + " ]"))));
}
}
実行結果
---------------------------
子プロセスの一覧:
PID: [ 0 ]、コマンド: [ Optional.empty ]
PID: [ 4 ]、コマンド: [ Optional.empty ]
PID: [ 424 ]、コマンド: [ Optional.empty ]
PID: [ 504 ]、コマンド: [ Optional.empty ]
PID: [ 560 ]、コマンド: [ Optional.empty ]
PID: [ 444 ]、コマンド: [ Optional.empty ]
PID: [ 1236 ]、コマンド: [ Optional.empty ]
PID: [ 1288 ]、コマンド: [ Optional.empty ]
PID: [ 1408 ]、コマンド: [ Optional.empty ]
PID: [ 1424 ]、コマンド: [ Optional.empty ]
PID: [ 1452 ]、コマンド: [ Optional.empty ]
PID: [ 1468 ]、コマンド: [ Optional.empty ]
PID: [ 5412 ]、コマンド: [ Optional[C:\\WINDOWS\\System32\\taskhostex.exe] ]
PID: [ 3760 ]、コマンド: [ Optional[C:\\Program Files\\Synaptics\\SynTP\\SynTPEnh.exe] ]
PID: [ 5216 ]、コマンド: [ Optional[C:\\WINDOWS\\explorer.exe] ]
PID: [ 2460 ]、コマンド: [ Optional[C:\\Program Files (x86)\\Dell Wireless\\Bluetooth Suite\\BtvStack.exe] ]
PID: [ 6064 ]、コマンド: [ Optional[C:\\Program Files\\Realtek\\Audio\\HDA\\RtkNGUI64.exe] ]
PID: [ 7172 ]、コマンド: [ Optional[C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe] ]
PID: [ 860 ]、コマンド: [ Optional[C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe] ]
PID: [ 9000 ]、コマンド: [ Optional.empty ]
PID: [ 4180 ]、コマンド: [ Optional[C:\\WINDOWS\\System32\\cmd.exe] ]
PID: [ 3748 ]、コマンド: [ Optional[C:\\WINDOWS\\System32\\conhost.exe] ]
PID: [ 3376 ]、コマンド: [ Optional.empty ]
PID: [ 2548 ]、コマンド: [ Optional.empty ]
PID: [ 1820 ]、コマンド: [ Optional[C:\\Program Files\\Java\\jdk-9.0.4\\bin\\java.exe] ]
実行結果を見ると、システムプロセスなどアクセス権限の関係でコマンド情報を取得できないプロセスはOptional.emptyとなり、通常のアプリケーションプロセスについては実行ファイルのパスが表示されていることがわかります。
補足:孫プロセスまで含めて取得するには
直接の子プロセスだけでなく、孫プロセス以下のすべての子孫プロセスを取得したい場合は、descendants()メソッドを使用します。また、現在実行中の自分自身のプロセスハンドルはProcessHandle.current()、親プロセスはparent()メソッドでそれぞれ取得できます。これらのAPIを組み合わせることで、JavaアプリケーションからOSのプロセスツリーを柔軟に操作できるようになります。
-
【Android開発】Year APIクラスを使って現在の年を取得・表示する方法
はじめにこのチュートリアルでは、java.timeパッケージに含まれるYear APIクラスを使って、Androidアプリで現在の年を取得し画面に表示する方法を解説します。Calendarクラスなどを直接操作するよりも直感的に年情報を扱えるため、日付処理を行うアプリの開発に役立ちます。ステップ1:新規プロジェクトを作成するAndroid Studioを開き、File ⇒ New Project を選択します。必要な項目をすべて入力して、新しいプロジェクトを作成しましょう。ステップ2:レイアウトファイル(activity_main.xml)を編集するres/layout/activit
-
Java 9のProcessBuilderを使ってプロセスを作成・管理する方法
Java 9では、Process APIが強化され、新たにProcessHandleインターフェースが追加されました。ProcessHandleのインスタンスはローカルプロセスを識別し、プロセスの状態(ステータス)の照会やプロセス管理を可能にします。従来はローカルプロセスのPIDを取得するためにネイティブコードが必要でしたが、ProcessHandle.Infoを使えば、その必要なくPIDやその他のプロセス情報を簡単に取得できるようになりました。 ProcessBuilderクラスは、オペレーティングシステム上で独立したプロセスを作成するために使用されるクラスです。以下の例では、Process