【问题标题】:How to get Java like PID in scala如何在scala中获得像PID一样的Java
【发布时间】:2022-06-15 04:09:55
【问题描述】:

在我的 Java 程序中,我使用“this.PID”来获取当前进程的 PID。

我正在 Scala 中寻找类似的东西 - 如何获得相同的 6 char 唯一 PID(如 java prgm)。

浏览了多个帖子。一旦这样的帖子建议使用“MemoryManagementFactory”。 但是,这会返回 @Hostname。不过,我正在寻找一种获得类似 6 char JVM 格式 PID 的方法。

请提出建议。斯卡拉版本:2.11

【问题讨论】:

标签: scala


【解决方案1】:

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。

【讨论】:

    猜你喜欢
    • 2016-05-25
    • 2012-02-27
    • 2015-11-28
    • 2022-11-24
    • 2013-01-11
    • 2012-11-04
    • 1970-01-01
    • 2018-11-19
    • 2012-03-03
    相关资源
    最近更新 更多