【问题标题】:Java: Get a process given a pidJava:获取给定pid的进程
【发布时间】:2011-04-28 20:31:25
【问题描述】:

假设我有一个已知的当前正在运行的进程,我如何将它转换为 Java 中的 Process 对象? 该进程已经在运行,所以我不想生成另一个进程,我只想将它封装到可以在 java 代码中使用的 Process 对象中。 大致如下:

int pid = getPid();
Process proc = magicGetProcess(pid);

谢谢

【问题讨论】:

  • 我不认为Java内置了足够的进程管理能力。希望有人能证明我错了。
  • 你最想要Process的哪些功能?您是在尝试waitFor(),还是希望能够将输入/输出流重定向到您的应用程序,或者什么?我很确定您的要求本身是不可能的,但我们或许可以帮助您满足您的实际要求。
  • 好吧,我需要将此过程传递给一个方法,该方法几乎可以检查它是否意外终止,如果确实如此,则获取退出代码。

标签: java process pid


【解决方案1】:

我认为仅使用内置库是不可能的。 AFAIK,获取正在运行的进程自己的 PID 已经很重要了(参见feature requestalternate mechanisms)。

快速浏览java.lang.Process class 表明您可以使用JNI 和本机代码编写java.lang.Process 的自定义实现。然后,您的自定义类可以实现额外的方法,例如您问题中的方法。

【讨论】:

  • 嗯,这就是它的样子。哦,好吧。
  • 仅供参考:java.lang.Process 的 URL 损坏
【解决方案2】:

在 *nix 世界中,获取非子进程的退出代码并不容易,因为一旦父进程获取了子进程的退出代码,退出代码就会与进程一起消失。您可以使用一些跟踪工具附加到正在运行的进程,并在进程终止时获取其退出代码。大多数 *nix 操作系统都有命令行工具,可以让您以非侵入式的方式执行此操作(例如 Linux 上的 strace,SunOS 上的 truss)。但是,您只能将它们用于您自己的进程或以 root 身份运行。另一种选择是配置操作系统的审计子系统来记录所有进程的退出代码。

【讨论】:

  • 在 Unix 上,您可以使用 waitpid() 函数来获取非子进程的退出代码。问题是从 Java 调用它。
【解决方案3】:

你不能。 Process 中的每个操作都要求该进程是子进程。不是任意进程。

【讨论】:

    【解决方案4】:

    使用 RMI 怎么样?是否可以将 Process 对象传递给 Process 对象?可能不会,因为进程不可序列化

    【讨论】:

      猜你喜欢
      • 2014-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 2023-04-02
      • 1970-01-01
      • 2015-02-16
      • 1970-01-01
      相关资源
      最近更新 更多