开发环境
- eclipse 4.7.3a
- jdk 9
主题
- 获取进程信息
- 获取进程输出信息
- 过滤进程信息
- 处理进程终止时回调
- 控制对敏感进程信息的访问
进程 API允许启动,检索有关本机操作系统进程的信息并对其进行管理
JDK 提供了下列进程API:
- ProcessBuilder
- Process
- ProcessHandle
- ProcessHandle.Info
获取进程信息
以下代码演示如果获取当前ping命令进程信息:
// 创建进程生成器
ProcessBuilder pb = new ProcessBuilder("ping", "-n", "3", "www.163.com");
// 启动进程
Process process = pb.start();
// 获取进程信息对象
ProcessHandle.Info info = process.info();
String na = "<not available>";
// 打印进程信息
System.out.printf("Process ID: %s%n", process.pid());
System.out.printf("Command name: %s%n", info.command().orElse(na));
System.out.printf("Command line: %s%n", info.commandLine().orElse(na));
// more
// 阻塞等待进程结束
process.waitFor();
获取进程输出信息
使用redirectOutput方法接收进程输出信息:
ProcessBuilder pb = new ProcessBuilder("ping", "-n", "3", "www.baidu.com") ;
pb .redirectOutput(outFile) .redirectError(Redirect.INHERIT);
过滤进程信息
以下代码演示获取当前用户的进程信息:
static void filterProcessesTest()
{
Optional<String> currUser = ProcessHandle.current().info().user();
ProcessHandle.allProcesses().filter(p1 -> p1.info().user().equals(currUser))
.sorted(ProcessTest::parentComparator).forEach(ProcessTest::showProcess);
}
static int parentComparator(ProcessHandle p1, ProcessHandle p2)
{
long pid1 = p1.parent().map(ph -> ph.pid()).orElse(-1L);
long pid2 = p2.parent().map(ph -> ph.pid()).orElse(-1L);
return Long.compare(pid1, pid2);
}
static void showProcess(ProcessHandle ph)
{
ProcessHandle.Info info = ph.info();
System.out.printf("pid: %d, user: %s, cmd: %s%n", ph.pid(), info.user().orElse("none"),
info.command().orElse("none"));
}
处理进程终止时回调
ProcessBuilder pb = new ProcessBuilder("ping", "-n", "3", "www.163.com");
Process process = pb.start();
//
p.onExit().thenAccept(onExitMethod);
// thenApply 和thenRun类似,函数式lamba表达式
// thenRun 运行指定的函数,类似于Runnable方式的lamba表达式
// thenApplyAsyc 异步运行指定的函数通过orkJoinPool.commonPool()
// get(long timeout, TimeUnit unit) 等待进程结束,在给定的时间范围内
// isDone 如果进程已经终止返回true
控制对敏感进程信息的访问
如果应用程序使用SecurityManager类来实现安全策略,那么为了使其能够访问进程信息,安全策略必须授予RuntimePermission(“manageProcess”)。
网友评论