Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

วิธีดึง child processes ทั้งหมดของ process ด้วย Process API ใน Java 9

คลาสจัดการ Process และ API ที่เกี่ยวข้องนำมารวมใน Java 9 ใช้ ProcessHandle interface และเมธอดที่เกี่ยวข้องเพื่อดึง pid และข้อมูล process อื่นๆ ที่เกี่ยวข้อง ต้องการดึง child processes ทั้งหมดของ process ใช้เมธอด java.lang.ProcessHandle.children() เมธอดนี้คืน stream โดยทั่วไป process ที่ไม่มี children จะคืน stream ว่าง

ตัวอย่าง: ดึง child processes ของ process แรก

import java.util.stream.Stream;
import java.util.Optional;

public class ChilderenProcessTest {
    public static void main(String args[]) throws InterruptedException {
        System.out.println("---------------------------");
        System.out.println("Children Processes:");
        
        Optional<ProcessHandle> processHandle = ProcessHandle.allProcesses().findFirst();
        processHandle.ifPresent(proc -> proc.children().forEach(child -> 
            System.out.println("PID: [ " + child.pid() + " ], Cmd: [ " + child.info().command() + " ]")));
    }
}

ผลลัพธ์ (ตัวอย่าง)

---------------------------
Children Processes:
PID: [ 0 ], Cmd: [ Optional.empty ]
PID: [ 4 ], Cmd: [ Optional.empty ]
PID: [ 424 ], Cmd: [ Optional.empty ]
PID: [ 504 ], Cmd: [ Optional.empty ]
PID: [ 560 ], Cmd: [ Optional.empty ]
PID: [ 444 ], Cmd: [ Optional.empty ]
PID: [ 1236 ], Cmd: [ Optional.empty ]
PID: [ 1288 ], Cmd: [ Optional.empty ]
PID: [ 1408 ], Cmd: [ Optional.empty ]
PID: [ 1424 ], Cmd: [ Optional.empty ]
PID: [ 1452 ], Cmd: [ Optional.empty ]
PID: [ 1468 ], Cmd: [ Optional.empty ]
PID: [ 5412 ], Cmd: [ Optional[C:\WINDOWS\System32\taskhostex.exe] ]
PID: [ 3760 ], Cmd: [ Optional[C:\Program Files\Synaptics\SynTP\SynTPEnh.exe] ]
PID: [ 5216 ], Cmd: [ Optional[C:\WINDOWS\explorer.exe] ]
PID: [ 2460 ], Cmd: [ Optional[C:\Program Files (x86)\Dell Wireless\Bluetooth Suite\BtvStack.exe] ]
PID: [ 6064 ], Cmd: [ Optional[C:\Program Files\Realtek\Audio\HDA\RtkNGUI64.exe] ]
PID: [ 7172 ], Cmd: [ Optional[C:\Program Files (x86)\Google\Chrome\Application\chrome.exe] ]
PID: [ 860 ], Cmd: [ Optional[C:\Program Files (x86)\Google\Chrome\Application\chrome.exe] ]
PID: [ 9000 ], Cmd: [ Optional.empty ]
PID: [ 4180 ], Cmd: [ Optional[C:\WINDOWS\System32\cmd.exe] ]
PID: [ 3748 ], Cmd: [ Optional[C:\WINDOWS\System32\conhost.exe] ]
PID: [ 3376 ], Cmd: [ Optional.empty ]
PID: [ 2548 ], Cmd: [ Optional.empty ]
PID: [ 1820 ], Cmd: [ Optional[C:\Program Files\Java\jdk-9.0.4\bin\java.exe] ]

เมธอดที่เกี่ยวข้อง

  • children() - Stream<ProcessHandle> direct children เฉพาะ
  • descendants() - Stream<ProcessHandle> ทุก descendants (children, grandchildren, ...)
  • parent() - Optional<ProcessHandle> parent process

การใช้งานจริง

// หา child processes ของ current process
ProcessHandle.current().children()
    .forEach(child -> System.out.println("Child PID: " + child.pid()));

// หา descendant processes ทั้งหมด
ProcessHandle.current().descendants()
    .forEach(desc -> System.out.println("Descendant PID: " + desc.pid()));

// ตรวจสอบ process tree
ProcessHandle ph = ProcessHandle.of(pid).orElseThrow();
ph.descendants().forEach(d -> {
    System.out.println(d.pid() + " parent: " + d.parent().map(ProcessHandle::pid).orElse(-1));
});

Process API ช่วยสร้าง process tree และ monitor process hierarchy ได้อย่างง่ายดาย