java 9及更高版操作和查询本地进程中信息:如关闭window或Linux中的进程
打开某个进程并获取进程信息
public static void startAndGetProcessInfo() throws IOException {
ProcessBuilder pb = new ProcessBuilder("calc.exe");
String na = "<not available>";
Process p = pb.start();
ProcessHandle.Info info = p.info();
System.out.printf("Process ID: %s%n", p.pid());
System.out.printf("Command name: %s%n", info.command().orElse(na));
System.out.printf("Command line: %s%n", info.commandLine().orElse(na));
System.out.printf("Start time: %s%n",info.startInstant().map(i -> i.atZone(ZoneId.systemDefault()).toLocalDateTime().toString()).orElse(na));
System.out.printf("Arguments: %s%n",info.arguments().map(a -> Stream.of(a).collect(Collectors.joining(" "))) .orElse(na));
System.out.printf("User: %s%n", info.user().orElse(na));
}
在Java 9中,ProcessHandle类提供了操作和查询本地进程中信息的能力
public static void processHandleTest() {
long currentProcessId = ProcessHandle.current().pid();
System.out.println("Current Process ID: " + currentProcessId);
ProcessHandle.current().children().forEach(child -> {
System.out.println("Child Process ID: " + child.pid() + ", Name: " + child.info().command().orElse("<unknown command>"));
});
Optional<ProcessHandle> parent = ProcessHandle.current().parent();
if(parent.isPresent()){
ProcessHandle processHandle = parent.get();
System.out.println("Parent Process ID: " + processHandle.pid() + ", Name: " + processHandle.info().command().orElse("<unknown command>"));
}
ProcessHandle.allProcesses()
.sorted(Comparator.comparing(x->x.info().command().orElse("")))
.forEach(processHandle -> System.out.println("processHandle Process ID: " + processHandle.pid() + ", Name: " + processHandle.info().command().orElse("<unknown command>")));
}
销毁进程
private static void destroyProcessById(long targetProcessId) {
Optional<ProcessHandle> targetProcessOpt = ProcessHandle.of(targetProcessId);
if (targetProcessOpt.isPresent()) {
ProcessHandle targetProcess = targetProcessOpt.get();
targetProcess.destroy();
targetProcess.onExit().thenRun(() -> {
System.out.println("目标进程Id " + targetProcess.pid() + " 已经被销毁");
});
} else {
System.out.println("没有找到对应的进程Id " + targetProcessId);
}
}
完整代码
import java.io.IOException;
import java.time.ZoneId;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;
public class ProcessHandleDemo {
public static void main(String[] args) throws Exception {
processHandleTest();
}
public static void startAndGetProcessInfo() throws IOException {
ProcessBuilder pb = new ProcessBuilder("calc.exe");
String na = "<not available>";
Process p = pb.start();
ProcessHandle.Info info = p.info();
System.out.printf("Process ID: %s%n", p.pid());
System.out.printf("Command name: %s%n", info.command().orElse(na));
System.out.printf("Command line: %s%n", info.commandLine().orElse(na));
System.out.printf("Start time: %s%n",info.startInstant().map(i -> i.atZone(ZoneId.systemDefault()).toLocalDateTime().toString()).orElse(na));
System.out.printf("Arguments: %s%n",info.arguments().map(a -> Stream.of(a).collect(Collectors.joining(" "))) .orElse(na));
System.out.printf("User: %s%n", info.user().orElse(na));
}
public static void processHandleTest() {
long currentProcessId = ProcessHandle.current().pid();
System.out.println("Current Process ID: " + currentProcessId);
ProcessHandle.current().children().forEach(child -> {
System.out.println("Child Process ID: " + child.pid() + ", Name: " + child.info().command().orElse("<unknown command>"));
});
Optional<ProcessHandle> parent = ProcessHandle.current().parent();
if(parent.isPresent()){
ProcessHandle processHandle = parent.get();
System.out.println("Parent Process ID: " + processHandle.pid() + ", Name: " + processHandle.info().command().orElse("<unknown command>"));
}
ProcessHandle.allProcesses()
.sorted(Comparator.comparing(x->x.info().command().orElse("")))
.forEach(processHandle -> System.out.println("processHandle Process ID: " + processHandle.pid() + ", Name: " + processHandle.info().command().orElse("<unknown command>")));
long targetProcessId = 31384;
destroyProcessById(targetProcessId);
}
private static void destroyProcessById(long targetProcessId) {
Optional<ProcessHandle> targetProcessOpt = ProcessHandle.of(targetProcessId);
if (targetProcessOpt.isPresent()) {
ProcessHandle targetProcess = targetProcessOpt.get();
targetProcess.destroy();
targetProcess.onExit().thenRun(() -> {
System.out.println("目标进程Id " + targetProcess.pid() + " 已经被销毁");
});
} else {
System.out.println("没有找到对应的进程Id " + targetProcessId);
}
}
}