如果我使用Scala Process/ProcessBuilder启动了一个进程.我怎样才能获得创建过程的pid?
我找不到PID提及任何官方文档: http://www.scala-lang.org/api/2.10.4/index.html#scala.sys.process.Process HTTP://www.scala -lang.org/api/2.10.4/index.html#scala.sys.process.ProcessBuilder http://www.scala-lang.org/api/2.10.4/index.html#scala.sys.process.包
2016年:同样的问题; 我一直在点击相关问题几分钟,但仍然找不到任何一致同意的解决方案.这是一个Scala版本,灵感来自于由wingedsubmariner链接的答案中的LRBH10的Java代码:
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))
Run Code Online (Sandbox Code Playgroud)
警告:scala代码运行器本质上只是一个bash脚本,所以当你使用它来启动scala程序时,它会在实际启动java进程之前做很多事情.因此,java您实际感兴趣的-process 的PID 将远大于上面的代码片段返回的PID .因此,如果您使用此方法启动流程,则此方法基本上无用scala.java直接使用,并将Scala库显式添加到类路径中.
这些scala.sys.io.process类是用于启动进程的 Java 类的包装器,不幸的是很难从此 API 获取 PID。请参阅 stackoverlow 问题,如何获取我刚刚在 java 程序中启动的进程的 PID?。