And*_*kin 5

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 2.12和Java 8进行测试 (3认同)

win*_*ner 3

这些scala.sys.io.process类是用于启动进程的 Java 类的包装器,不幸的是很难从此 API 获取 PID。请参阅 stackoverlow 问题,如何获取我刚刚在 java 程序中启动的进程的 PID?