在Java中获取子进程ID

问题描述 投票:14回答:5

我是这样创建子进程的。

String command = new String("some_program");

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

如何获得子进程的ID?

P.S. 我在Linux上工作。

java linux process
5个回答
28
投票

目前还没有公开的API(参见 http:/bugs.sun.comugdatabaseview_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 ) );

1
投票

我曾经尝试过这样做(但失败了)。最后我把我的命令封装在一个shell脚本中,把pid转储到一个文件中。虽然不是最好的解决方案,但它让我克服了这个障碍。


1
投票

好吧,没有任何记录在案的方法可以做到这一点,但恰好进程实现类是UNIXProcess,它有一个pid字段。 所以你可以使用反射来访问这个私有字段来获取ID。 在网上搜索一下,你会发现其他的技巧,就是调用另一个shell来获取ps输出之类的东西。 没什么简单的。


1
投票

来自 此处

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));
}

0
投票

在linux上是微不足道的。

String pid = new File("/proc/self").getCanonicalFile().getName();
© www.soinside.com 2019 - 2024. All rights reserved.