Process API 学习笔记

开发环境
  • 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 = "";

// 打印进程信息
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 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”)。

Github工程地址

你可能感兴趣的