Scala 没有特殊的 API 来获取进程 ID。由于 JVM,这当然是有限的。由于 Scala 在 JVM 上运行,因此无论您在何种架构上运行程序,都没有独立于平台的 API 可以工作。因此,Scala 在此上下文中可以提供的大部分内容都是在 Java API 已在进程上下文中提供的内容之上的包装器。
例如,您可以尝试scala.sys.process,但正如文档所述:
整个包的底层基础是Java的Process和
ProcessBuilder 类。虽然没有必要使用这些 Java
类,它们对可能的事物施加了界限。一个不能,因为
例如,检索正在执行的任何进程的进程 ID。
However, in Windows 您可以使用ManagementFactory.getRuntimeMXBean.getName 方法生成[PID]@[MACHINE_NAME] 形式的字符串,您可以进一步处理它以仅获取PID。
从JDK 10开始也可以直接使用ManagementFactory.getRuntimeMXBean.getPid获取PID。
但是在这两种情况下你都会得到当前正在运行的 JVM 的 PID,所以如果你需要其他正在运行的程序的 PID,我认为这是不可能的。
这是等效的 Scala 代码:
object Program extends App {
import java.lang.management.ManagementFactory
val bean = ManagementFactory.getRuntimeMXBean
// Get name representing the running Java virtual machine.
// It returns something like [PID]@[MACHINE_NAME]. The value before
// the @ symbol is the PID.
val jvmName = bean.getName
System.out.println("Name = " + jvmName)
// Extract the PID by splitting the string returned by the
// bean.getName() method.
var pid = jvmName.split("@")(0).toLong
System.out.println("PID = " + pid)
// Since JDK 10 you can get the process ID representing the running Java virtual machine.
pid = ManagementFactory.getRuntimeMXBean.getPid
System.out.println("PID = " + pid)
}
对我来说它输出:
Name = 12412@VALHALLA
PID = 12412
PID = 12412
VALHALLA是我的主机名,12412是当前JVM实例的PID。