【问题标题】:Get subprocess id in Java在Java中获取子进程ID
【发布时间】:2009-12-13 20:33:27
【问题描述】:

我正在以这种方式创建子流程:

String command = new String("some_program");

Process p = Runtime.getRuntime().exec(command);

我如何获得该子进程 ID?

附:我在 Linux 上工作。

【问题讨论】:

  • 字符串推荐 = "some_program" 在这种情况下更好
  • 这不是真正的代码。只是一个描述问题的sn-p。

标签: java linux process


【解决方案1】:

目前还没有公开的 API(参见 http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4244896),但有一些变通方法。

第一个解决方法是使用像ps 这样的外部程序并使用Runtime.exec() 调用它来获取pid :)

另一个基于java.lang.Process 类是抽象的事实,并且您实际上会根据您的平台获得一个具体的子类。在 Linux 上,你会得到一个 java.lang.UnixProcess,它有一个私有字段 int pid。使用反射,可以很方便的得到这个字段的值:

Field f = p.getClass().getDeclaredField("pid");
f.setAccessible(true);
System.out.println( f.get( p ) );

【讨论】:

  • 好问题!而且我想知道为什么这样的错误开放了 10 多年没有解决?
  • 可能是因为 Sun 希望您留在 JVM 中。
  • 可能是因为请求是关于 java.lang.System 的。并且将 PID 放在那里会将其变成特定于平台的,这是错误的。但是 UnixProcess 没有理由隐藏它。
  • 谢谢,完美运行。刚刚填写 RFE@sun.com 来解决这个问题。
  • @Bozho 好吧,您实际上不应该操作像 UnixProcess 这样的平台特定类。
【解决方案2】:

不久前我尝试过(但失败了)这样做。我最终将我的命令包装在一个将 pid 转储到文件的 shell 脚本中。不是最好的解决方案,但它让我克服了这个障碍。

【讨论】:

  • 这是我的第一个想法。但它不适合我。 “命令”几乎可以是任何程序,不是我准备的。无论如何谢谢。
【解决方案3】:

好吧,没有记录的方法可以做到这一点,但是 Process 实现类是 UNIXProcess,并且它有一个 pid 字段。所以你可以使用反射来访问这个私有字段来获取 ID。用谷歌搜索你会发现调用另一个 shell 来获取 ps 输出的其他技巧和类似的东西。没那么容易。

【讨论】:

    【解决方案4】:

    来自here

    public static void main(String[] args) throws IOException {
        byte[] bo = new byte[100];
        String[] cmd = {"bash", "-c", "echo $PPID"};
        Process p = Runtime.getRuntime().exec(cmd);
        p.getInputStream().read(bo);
        System.out.println(new String(bo));
    }
    

    【讨论】:

    • 我以前发现过那个帖子,但它不适合我。我无法准备修改会输出 PID 的子进程程序。
    猜你喜欢
    • 2017-05-23
    • 2011-07-16
    • 2012-12-27
    • 1970-01-01
    • 2013-11-11
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 2016-01-20
    相关资源
    最近更新 更多