2014-04-24 39 views

回答

2

2016:同样的问题;我已经点击了相关的问题几分钟,但仍然找不到任何通用的解决方案。下面是LRBH10的Java代码由wingedsubmariner链接的答案启发Scala的版本:

import scala.sys.process.Process 

def pid(p: Process): Long = { 
    val procField = p.getClass.getDeclaredField("p") 
    procField.synchronized { 
    procField.setAccessible(true) 
    val proc = procField.get(p) 
    try { 
     proc match { 
     case unixProc 
      if unixProc.getClass.getName == "java.lang.UNIXProcess" => { 
      val pidField = unixProc.getClass.getDeclaredField("pid") 
      pidField.synchronized { 
      pidField.setAccessible(true) 
      try { 
       pidField.getLong(unixProc) 
      } finally { 
       pidField.setAccessible(false) 
      } 
      } 
     } 
     // If someone wants to add support for Windows processes, 
     // this would be the right place to do it: 
     case _ => throw new RuntimeException(
      "Cannot get PID of a " + proc.getClass.getName) 
     } 
    } finally { 
     procField.setAccessible(false) 
    } 
    } 
} 

// little demo 
val proc = Process("echo 'blah blah blaaah'").run() 
println(pid(proc)) 

警告:Scala代码亚军本质上只是一个bash脚本,所以当你用它发射的Scala程序,它会做千在实际启动java过程之前的事情。因此,您实际感兴趣的java进程的PID将比上面的代码片段返回的大得多。因此,如果您使用scala开始处理,此方法实际上是无用的。直接使用java,并将Scala库明确添加到类路径中。

+1

使用Scala 2.12和Java 8测试 –