从Java中查找Linux发行版的名称

6

我们正在使用Java编写一个小型库,需要从底层系统收集信息。我们可以从Java中的系统属性中读取大部分内容,但是在Linux上运行时似乎无法找到提取发行版名称的正确方法。调用

System.getProperty("os.name");

返回 "Linux"(我们也收集)但我们正在寻找一种方法来获取例如 "Ubuntu"。我们需要在Java中实现此解决方案,并且不希望进行一些/etc/release解析。


你知道有没有任何API(我指的是非Java)可以提供那些信息吗? - Ringding
1
其实并不是这样。从我的谷歌搜索结果来看,执行一些 cat /etc/*release 命令可以获取一些信息,但并不可靠。我真的希望你们中的一些人之前遇到过这个问题并解决了它... - soren.enemaerke
1
这是特定于发行版的;我根本没有/etc/release(即使在Debian上,即使安装了lsb)。我查看了lsb_release源代码(它只是一个Python脚本),它从apt中解析大部分发行版信息。比那更容易的方法(特定于Debian)是查看/etc/debian_version(uname -a也不可靠)。 - barti_ddu
我们正在用Java编写一个小型库,需要从底层系统收集信息。对于这样的需求,我的初始反应是问:“为什么这种信息与你有关?” - Stephen C
@Stephen: 虽然这听起来有点居高临下,但你提出了一个很好的观点:询问原始问题,而不是那个问题所认为的解决方案! - Arafangion
@Stephen:我们的任务是收集使用统计数据,操作系统是我们要收集的参数之一(收集时已经得到用户同意)。 - soren.enemaerke
3个回答

9
你可以尝试调用lsb_release -i,但这并不保证有效。

在我使用的Debian系统上,这会返回“Distributor ID: Debian”,看起来非常有希望! - Arafangion
@Arafangion:只有安装了lsb*软件包才行 :) 否则无法工作。 - barti_ddu
实际上,lsb_release -d 也给了我非常好的信息,你应该先尝试一下这个。 - John

8

要可靠准确地完成这个任务是不可能的,我能提供的最好建议就是使用“uname -a”的输出结果。

注意:这不是Java的限制,只是没有一种常见(且准确)的方式来识别发行版。


你可以在 /etc 目录中进行探查,并根据例如你知道 Fedora 和 Ubuntu 安装了哪些文件来推断事情,但是你需要在程序中设置规则,而且可能会出错。最好测试实际功能。 - Thorbjørn Ravn Andersen

4

我通常使用以下命令:

cat /etc/issue

用Java读取这个文件应该很容易。问题是这个文件是否存在于每个(或至少大多数)Linux发行版中。我在需要时到处找到它,但是它并不经常需要。


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