ProcessHandle und Prozess-IDs
Ein ProcessHandle ist ein neuer Typ in Java 9, der native Prozesse identifiziert. Wir bekommen Exemplare entweder über
- die Process-Objektmethode
toHandle(), - die statische Methodecurrent(),
allProcesses(), die alle Prozesse über einenStream<ProcessHandle> liefert,- die statische ProcessHandle-Methode
of(long pid), die uns das ProcessHandle in einOptionalverpackt, - mit einem vorhandenen ProcessHandle können wir weiterhin mit
children()unddescendants()einenStream<ProcessHandle> erfragen und mitparent()auf die Eltern zugreifen.
Jeder Prozess verfügt über eine identifizierende long-Ganzahl, die getPid() auf dem ProcessHandle liefert. Weitere Details zu den Startparametern offenbare ProcessHandle.Info-Ojekte.
Beispiel: Gib alle vorhanden Informationen über alle Prozesse aus:
Consumer log = handle ->
System.out.printf( "PID=%s, Root?=%s, Info=%s%n",
handle.getPid(), !handle.parent().isPresent(), handle.info() );
ProcessHandle.allProcesses().forEach( log );
Die Ausgabe kann so aussehen:
PID=0, Root?=true, Info=[]
PID=4, Root?=true, Info=[]
...
PID=4368, Root?=true, Info=[]
PID=4568, Root?=true, Info=[user: Optional[Yoga\Christian], cmd: C:\Windows\System32\sihost.exe, startTime: Optional[2017-02-04T20:54:07.601Z], totalTime: Optional[PT3M39.703125S]]
PID=4592, Root?=true, Info=[user: Optional[Yoga\Christian], cmd: C:\Windows\System32\svchost.exe, startTime: Optional[2017-02-04T20:54:07.621Z], totalTime: Optional[PT14.9375S]]
PID=4628, Root?=true, Info=[]
...
ProcessHandle implementiert vernünftig equals(…) und auch Comparable<ProcessHandle>; die Sortierung ist nach der Prozess-ID.
Methoden-Delegation
Einige Methoden aus Process delegieren an den assoziierten ProcessHandle. Die Methoden heißen gleich.
Process-MethodenImplementierunglong getPid()return toHandle().getPid();ProcessHandle.Info info()return toHandle().info();Stream<ProcessHandle> children()return toHandle().children();Stream<ProcessHandle> descendants()return toHandle().descendants();
Weiterhin gibt es onExit(), supportsNormalTermination(), isAlive(), destroy() und destroyForcibly() auf beiden Typen Process und ProcessHandle.
Über Objekte vom Typ ProcessHandle.Info lassen sich weitere Details zum Prozess erfragen; die Rückgaben sind Optional, weil die Informationen vielleicht nicht vorliegen.
- static interface java.lang.Info
Optional<String[]> arguments()Programmargumente beim Start.Optional<String> command()Ausführbarer Pfadname vom Prozess.Optional<String> commandLine()Konkatenation von command() und arguments() beste Repräsentation des Programmaufrufs.Optional<Instant> startInstant()Startzeit des Prozesses.Optional<Duration> totalCpuDuration()Bisher verbrauchte CPU-Zeit.Optional<String> user()Benutzer dieses Prozesses.