获取Java中的子进程id

获取Java中的子进程id,java,linux,process,Java,Linux,Process,我以这种方式创建子流程: String command = new String("some_program"); Process p = Runtime.getRuntime().exec(command); 如何获取子进程id 另外,我正在Linux上工作。不久前我尝试过(但失败了)这样做。最后,我将命令包装在一个shell脚本中,该脚本将pid转储到一个文件中。这不是最好的解决方案,但它让我克服了这个障碍。没有文档化的方法可以做到这一点,但碰巧流程实现类是UNIXProcess,并且它

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

String command = new String("some_program");

Process p = Runtime.getRuntime().exec(command);
如何获取子进程id


另外,我正在Linux上工作。

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

没有文档化的方法可以做到这一点,但碰巧流程实现类是UNIXProcess,并且它有一个pid字段。因此,您可以使用反射来访问这个私有字段以获取ID。通过谷歌搜索,您将发现调用另一个shell以获取ps输出之类的其他技巧。这并不容易。

仍然没有用于此的公共API(请参阅),但有一些解决方法

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

另一个是基于
java.lang.Process
类是抽象的,并且根据您的平台,您实际上得到了一个具体的子类。在Linux上,您将得到一个
java.lang.UnixProcess
,它有一个私有字段
intpid
。使用反射,您可以轻松获得此字段的值:

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

linux上的琐碎:

String pid = new File("/proc/self").getCanonicalFile().getName();

这是我的第一个想法。但它不适合我。“命令”几乎可以是任何程序,而不是由我自己编写的。不管怎样,我以前找到过那个帖子,但它不适合我。我无法准备修改子流程程序,它将输出PID。字符串command=“some_program”在这种情况下更好,它不是真正的代码。只是一个描述问题的片段。好问题!我想知道为什么这样一个bug会持续10多年而得不到解决?可能是因为Sun希望您留在JVM中。可能是因为请求是关于java.lang.System的。把PID放在那个里会把它变成特定于平台的,这是错误的。但是UnixProcess没有理由隐藏它。谢谢,它工作得很好。刚刚填充了RFE@sun.com来解决这个问题。@Bozho好吧,您实际上不应该操作平台特定的类,比如
UnixProcess
String pid = new File("/proc/self").getCanonicalFile().getName();