java 9及更高版操作和查询本地进程中信息:如关闭window或Linux中的进程
- 打开某个进程并获取进程信息
- [在Java 9中,ProcessHandle类提供了操作和查询本地进程中信息的能力](#在Java 9中,ProcessHandle类提供了操作和查询本地进程中信息的能力)
- 销毁进程
- 完整代码
打开某个进程并获取进程信息
java
/**
* 打开某个进程并获取进程信息
* @throws IOException
*/
public static void startAndGetProcessInfo() throws IOException {
//这里可以输入命令 如cmd命令、打开软件命令:这里以打开window系统的计算器为例
//ProcessBuilder是jdk 1.5提供的
ProcessBuilder pb = new ProcessBuilder("calc.exe");
String na = "<not available>";
//开启计算器进程
Process p = pb.start();
//p.info()是Java 9才有的
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));
// 一般来说,对于计算器这样的独立进程,不需要读取其输出或等待其终止
// 但对于良好的编程习惯,特别是需要确保进程资源被正确关闭时,可以考虑添加以下代码
// process.waitFor(); // 等待进程执行完毕
// process.getInputStream().close();
// process.getOutputStream().close();
// process.getErrorStream().close();
}
在Java 9中,ProcessHandle类提供了操作和查询本地进程中信息的能力
java
public static void processHandleTest() {
// 获取当前进程的进程ID(PID)
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>")));
//关闭某个软件的所有进程
// ProcessHandle.allProcesses().filter(x->x.info().command().orElse("").equals("D:\\Program Files\\Google\\Chrome\\Application\\chrome.exe")).collect(Collectors.toList()).forEach(x->destroyProcessById(x.pid()));
// 假设我们有一个目标进程的PID
// long targetProcessId = 31384; // 请替换为实际的进程ID
// 尝试获取并销毁目标进程
// destroyProcessById(targetProcessId);
}
销毁进程
java
/**
* 销毁进程
* @param targetProcessId
*/
private static void destroyProcessById(long targetProcessId) {
Optional<ProcessHandle> targetProcessOpt = ProcessHandle.of(targetProcessId);
if (targetProcessOpt.isPresent()) {
ProcessHandle targetProcess = targetProcessOpt.get();
targetProcess.destroy(); // 发送SIGTERM信号
targetProcess.onExit().thenRun(() -> {
System.out.println("目标进程Id " + targetProcess.pid() + " 已经被销毁");
});
} else {
System.out.println("没有找到对应的进程Id " + targetProcessId);
}
}
完整代码
java
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();
}
/**
* 打开某个进程并获取进程信息
* @throws IOException
*/
public static void startAndGetProcessInfo() throws IOException {
//这里可以输入命令 如cmd命令、打开软件命令:这里以打开window系统的计算器为例
//ProcessBuilder是jdk 1.5提供的
ProcessBuilder pb = new ProcessBuilder("calc.exe");
String na = "<not available>";
//开启计算器进程
Process p = pb.start();
//p.info()是Java 9才有的
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));
// 一般来说,对于计算器这样的独立进程,不需要读取其输出或等待其终止
// 但对于良好的编程习惯,特别是需要确保进程资源被正确关闭时,可以考虑添加以下代码
// process.waitFor(); // 等待进程执行完毕
// process.getInputStream().close();
// process.getOutputStream().close();
// process.getErrorStream().close();
}
/**
* 在Java 9中,ProcessHandle类提供了操作和查询本地进程中信息的能力
*/
public static void processHandleTest() {
// 获取当前进程的进程ID(PID)
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>")));
//关闭某个软件的所有进程
// ProcessHandle.allProcesses().filter(x->x.info().command().orElse("").equals("D:\\Program Files\\Google\\Chrome\\Application\\chrome.exe")).collect(Collectors.toList()).forEach(x->destroyProcessById(x.pid()));
// 假设我们有一个目标进程的PID
long targetProcessId = 31384; // 请替换为实际的进程ID
// 尝试获取并销毁目标进程
destroyProcessById(targetProcessId);
}
/**
* 销毁进程
* @param targetProcessId
*/
private static void destroyProcessById(long targetProcessId) {
Optional<ProcessHandle> targetProcessOpt = ProcessHandle.of(targetProcessId);
if (targetProcessOpt.isPresent()) {
ProcessHandle targetProcess = targetProcessOpt.get();
targetProcess.destroy(); // 发送SIGTERM信号
targetProcess.onExit().thenRun(() -> {
System.out.println("目标进程Id " + targetProcess.pid() + " 已经被销毁");
});
} else {
System.out.println("没有找到对应的进程Id " + targetProcessId);
}
}
}