2016:同样的问题;我一直在点击相关问题几分钟,但仍然找不到任何普遍同意的解决方案。这是一个受 LRBH10 的 Java 代码启发的 Scala 版本,答案是由wingedsubmariner 链接的:
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会比上面代码sn-p返回的PID大很多。因此,如果您以scala 启动进程,则此方法基本上没有用。直接使用java,并将Scala库显式添加到类路径中。