【问题标题】:Get process id of Scala.sys.process.Process获取 Scala.sys.process.Process 的进程 ID
【发布时间】:2026-02-15 09:55:02
【问题描述】:

如果我使用 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.package

【问题讨论】:

    标签: scala


    【解决方案1】:

    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库显式添加到类路径中。

    【讨论】:

    • 用 Scala 2.12 和 Java 8 测试
    【解决方案2】:

    scala.sys.io.process 类是用于启动进程的 Java 类的包装器,不幸的是,很难从该 API 中获取 PID。请参阅 stackoverlow 问题,How to get PID of process I've just started within java program?

    【讨论】:

    • 哇,很惊讶知道这不受支持。谢谢!