gpt4 book ai didi

scala - 获取 Scala.sys.process.Process 的进程 ID

转载 作者:行者123 更新时间:2023-12-04 11:38:13 34 4
gpt4 key购买 nike

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

最佳答案

2016 年:同样的问题;我已经点击相关问题几分钟了,但仍然找不到任何普遍同意的解决方案。这是一个受 wingedsubmariner 链接的答案中 LRBH10 的 Java 代码启发的 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 库添加到类路径。

关于scala - 获取 Scala.sys.process.Process 的进程 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23279898/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com