Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Cách lấy tất cả child process của một process dùng Process API Java 9

Java 9 giới thiệu class xử lý process. Dùng ProcessHandle interface và phương thức liên quan lấy PID và thông tin process liên quan. Lấy tất cả child process: java.lang.ProcessHandle.children() – trả về stream, thường process không có child.

Ví dụ: Lấy child của process đầu tiên

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("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() + " ]")));
    }
}

Kết quả mẫu

---------------------------
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] ]

Giải thích

  • ProcessHandle.allProcesses().findFirst(): Lấy process đầu tiên trong snapshot (thường là system init process PID 0/4).
  • proc.children(): Stream direct children (không đệ quy).
  • child.info().command(): Optional<String> – executable path, có thể empty.
  • System process (PID 0, 4) thường không có command info.

Đệ quy lấy descendants

// Lấy TẤT CẢ descendants (con, cháu, chắt...)
processHandle.ifPresent(proc -> proc.descendants().forEach(desc -> 
    System.out.println("Descendant PID: " + desc.pid() + ", Cmd: " + desc.info().command().orElse("N/A"))));

Lưu ý

  • Cần quyền OS để xem process của user khác.
  • Snapshot – không real-time.
  • Windows: nhiều system process không expose command.

ProcessHandle.children()/descendants() thay thế parsing tasklist, ps, JNI – cách chuẩn, type-safe, cross-platform.