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库明确添加到类路径中。
哇,惊讶地知道这不支持。谢谢! – mbdev