【问题标题】:Is there a way to get/hook/attach an already running process using java?有没有办法使用java获取/挂钩/附加已经运行的进程?
【发布时间】:2011-11-24 13:21:38
【问题描述】:

我希望能够做这样的事情:

Process p  = getRunningProcess(pid)

如果有办法,如何创建进程(使用 java、使用 python、从 shell 等...)是否重要?

【问题讨论】:

标签: java process


【解决方案1】:

可以从 Java 应用程序附加到另一个 JVM 进程(例如能够to monitor what's going on and potentially detect problems before they happen)。您可以使用Attach API 来执行此操作。不太了解附加到非 JVM 进程。

String name = ...
List vms = VirtualMachine.list();
for (VirtualMachineDescriptor vmd: vms) {
    if (vmd.displayName().equals(name)) {
        VirtualMachine vm = VirtualMachine.attach(vmd.id());
        String agent = ...
        vm.loadAgent(agent);
        // ...
    }
}

【讨论】:

  • 谢谢,但我的目标是非 JVM 进程(或者更准确地说,任何类型的进程)。
  • 是否有任何用于将 Junit 测试用例附加到测试服务器的示例?
  • 需要tools.jar,也可以使用jvm-attach,不需要JDK
【解决方案2】:

是的,有一种方法可以使用 ProcessHandle 附加任何非 JVM 进程。

这里是一个代码示例,它启动计算器并使用 pid 将其关闭。

    Process calc = Runtime.getRuntime().exec("gnome-calculator"); 

    Thread.sleep(2000);

    long pid = calc.pid();


    Optional<ProcessHandle> optionalProcessHandle = ProcessHandle.of(pid);
    optionalProcessHandle.ifPresent(ProcessHandle::destroy);

但请确保运行 Java SE/JDK 11 或更高版本并导入 java.util.Optional;。

请参阅文档以了解可以与 ProcessHandle 一起使用的更多方法:
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/lang/ProcessHandle.html

感谢java.lang.ProcessHandle - compilation error 作为此模板。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-11
    • 2019-04-05
    • 1970-01-01
    • 2018-10-04
    • 2020-03-09
    • 2021-10-10
    • 1970-01-01
    • 2013-08-30
    相关资源
    最近更新 更多