在Java中查找物理机器名称

28

如何获取JVM所在的物理机器名称?

(物理 = 操作系统, 一直到 vmware...)

从发布者的评论中添加:
我指的是JVM运行所在计算机的名称。很可能是一个物理计算机,但如果JVM在另一个虚拟机中运行,那么该名称也是可以的。


什么平台?如果它是特定于操作系统的,那有关系吗? - Gandalf
最好是跨平台的。 - ripper234
5个回答

58
String computername=InetAddress.getLocalHost().getHostName();
System.out.println(computername);

7
请注意,这取决于 DNS 并且有可能失败:https://dev59.com/4Wsz5IYBdhLWcg3weHgA - Vadzim
2
问题的措辞是:“获取物理机器名称”,这不是正确答案。严格来讲,上述将为您提供主机的网络名称,通常是本地主机接口的名称。请参见https://dev59.com/OGs05IYBdhLWcg3wQvuq#40702767。Java没有(标准化的)方法来获取本地计算机的“机器名称”或“计算机名称”。 - peterh
完全同意@Vadzim的观点。如果没有DNS或动态DNS映射分配的IP地址,计算机返回的计算机名称可能与实际计算机名称非常不同。 - someone

12

在Windows上,如果你想获取工作站名称,可以使用以下代码:

System.getenv("COMPUTERNAME")

11

以下是几种选项,因为我不确定你想要的是什么:

RuntimeMXBean rmx = ManagementFactory.getRunTimeMXBean();
System.out.println(rmx.getName());

或者...

System.out.println(InetAddress.getLocalHost().getHostName());

或者在Linux上

Runtime r = Runtime.getRuntime();
Process p = r.exec("uname -a");
BufferedReader r = new BufferedReader(new InputStreamReader(p.getInputStream());
System.out.println(r.readLine());

我曾经认为getRunTimeMXBean()不是100%可靠的。 - Hector

1

我不确定你所说的“物理机器名称”是什么意思。你的评论“(Physical = OS, up to vmware...)”需要向我解释。

但是,您可以使用System.getProperty(String key),其中key是在此处找到的键之一:http://java.sun.com/j2se/1.5.0/docs/api/java/lang/System.html#getProperties()

这应该会告诉您操作系统名称。如果您需要主机名,请使用jsight的建议。


我的意思是JVM正在运行的计算机的名称。 很可能是一台物理计算机,但如果JVM在另一个虚拟机内运行,则该名称也可以。 - ripper234

0

我认为你无法可靠地找到这样的名称。

根据虚拟化的级别,您可能正在运行裸机、虚拟机、VM内的VM、Docker,甚至是某些云提供商的自定义JVM,这些可能具有额外的抽象级别和云特定的网络API处理。

我最近在处理一个任务,即识别机器以检测某个服务实例何时被卡住。这必须在托管的测试环境和云中的生产环境中都能正常工作。

如果云提供商的API(AWS SDK或Google Cloud Engine API)提供任何内容,我最终使用了特定的云提供商的API,否则使用网络API(请参见@jsight的答案),如果它提供像127.0.0.1或192.*这样的IP,则使用保证在任何JVM实例中只出现一次的对象的hash()

所有这些变化可能随时间而改变。目标是在某个给定的时刻唯一地标识节点。如果这是您的最终目标,我希望这可以帮助到您。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接