Java 9のProcess APIですべてのプロセスデータを取得する方法
Java 9のProcess APIによるプロセス管理
Java 9では、Process APIが拡張され、オペレーティングシステム上のプロセスをより細かく制御・管理できるようになりました。新たに導入されたProcessHandleクラスを使うと、プロセスのネイティブなプロセスID(PID)、開始時刻、累積CPU時間、引数、コマンド、ユーザー、親プロセス、子孫プロセスといった詳細情報を取得できます。
さらに、プロセスが生存しているかどうか(liveness)を確認するメソッドや、プロセスを破棄(destroy)するメソッドも用意されています。システム上で動作しているすべてのプロセスの情報は、静的メソッドallProcesses()を呼び出すことで、Streamとして一括取得できます。
サンプルコード
以下の例では、実行中のすべてのプロセス情報を取得して表示しています。
import java.util.Optional;
import java.util.stream.Stream;
public class AllProcessesTest {
public static void main(String args[]) throws InterruptedException {
System.out.println("---------------------------");
System.out.println("All Processes:");
Stream<ProcessHandle> processStream = ProcessHandle.allProcesses();
processStream.forEach(process -> printInfo(process));
}
private static void printInfo(ProcessHandle processHandle) {
System.out.println("---------");
System.out.println("Id: " + processHandle.pid());
System.out.println("isAlive(): " + processHandle.isAlive());
System.out.println("number of children: " + processHandle.children().count());
System.out.println("supportsNormalTermination(): " + processHandle.supportsNormalTermination());
ProcessHandle.Info processInfo = processHandle.info();
System.out.println("Info: " + processInfo.toString());
System.out.println("arguments().isPresent(): " + processInfo.arguments().isPresent());
System.out.println("command().isPresent(): " + processInfo.command().isPresent());
System.out.println("totalCpuDuration().isPresent(): " + processInfo.totalCpuDuration().isPresent());
System.out.println("user().isPresent(): " + processInfo.user().isPresent());
}
}
主なメソッドの説明
- ProcessHandle.allProcesses():現在実行中のすべてのプロセスに対応するProcessHandleのストリームを返します。
- pid():プロセスのネイティブなプロセスIDをlong型で返します。
- isAlive():プロセスが現在有効(生存中)かどうかを判定します。
- children().count():直接の子プロセスの数を返します。
- supportsNormalTermination():通常の手段でプロセスを正常終了できるかどうかを示します。
- info():コマンド、引数、開始時刻、累積CPU時間、ユーザーなどのスナップショット情報を持つProcessHandle.Infoを返します。各項目はOptionalでラップされており、OSやアクセス権限の制約により取得できない場合は空になります。
実行結果
---------------------------
All Processes:
Id: 7056
isAlive(): true
number of children: 0
supportsNormalTermination(): false
Info: [user: Optional[Tutorialspoint\User], cmd: C:\Program Files (x86)\Google\Chrome\Application\chrome.exe, startTime: Optional[2020-03-09T03:26:00.406Z], totalTime: Optional[PT1M52.15625S]]
arguments().isPresent(): false
command().isPresent(): true
totalCpuDuration().isPresent(): true
user().isPresent(): true
---------
Id: 6168
...
(以下、実行中のプロセスの数だけ同様の出力が続きます)
---------
Id: 1032
isAlive(): false
number of children: 0
supportsNormalTermination(): false
Info: []
arguments().isPresent(): false
command().isPresent(): false
totalCpuDuration().isPresent(): false
user().isPresent(): false
---------
Id: 5044
isAlive(): true
number of children: 0
supportsNormalTermination(): false
Info: [user: Optional[Tutorialspoint\User], cmd: C:\Program Files\Java\jdk-9.0.4\bin\java.exe, startTime: Optional[2020-03-09T04:12:39.567Z], totalTime: Optional[PT1.28125S]]
arguments().isPresent(): false
command().isPresent(): true
totalCpuDuration().isPresent(): true
user().isPresent(): true
まとめ
このように、Java 9のProcessHandleクラスとallProcesses()メソッドを組み合わせることで、タスクマネージャーのようなプロセス一覧をJavaプログラムから簡単に取得できます。ただし、引数(arguments)など一部の情報はOSやアクセス権限によって取得できない場合がある点に注意してください。また、すでに終了したプロセス(isAlive()がfalse)については、Infoの各項目がすべて空のOptionalとして返されます。
-
JavaでCSVファイルを読み込む方法|BufferedReaderによる基本的なデータ読み取り手順
CSVとは「Comma Separated Values(カンマ区切り値)」の略で、テキスト形式のデータファイルの一種です。CSVファイルでは、1行ごとに複数の項目がカンマ(,)で区切られて記録されており、拡張子は「.csv」として保存されます。表形式のデータを扱う際に広く利用されている、シンプルで汎用性の高いフォーマットです。 JavaでCSVファイルを読み込む仕組み JavaでCSVファイルを読み込むには、BufferedReaderクラスのreadLine()メソッドを使用するのが基本的な方法です。このメソッドを使うと、ファイルの内容を1行ずつ順番に読み取ることができます。 読み取った各
-
Javaでプロパティファイルからデータを読み取る方法を解説
JavaのPropertiesクラスは、Hashtableクラスのサブクラスであり、永続化可能なプロパティの集合(プロパティセット)を表します。Propertiesオブジェクトはストリームへ保存したり、ストリームから読み込んだりすることができます。また、プロパティリスト内の各キーとそれに対応する値は、どちらも文字列型として扱われます。Javaでは、Propertiesファイルを使うことでアプリケーションの設定情報を外部化し、キーと値(key-value)のペアとして管理できます。Propertiesクラスが提供するload()メソッドを使用すると、.propertiesファイルに記述されたキー