如何在跨平台环境中使用JNA获取Java中正在运行的进程列表?

时间:2016-06-29 15:16:31

标签: java cross-platform jna

我需要监控跨平台环境中的服务器:Windows,Unix(Aix,Solaris)和Linux。它意味着:获取进程,找到一些文件,......

所以我专注于 JNA(Java Native Access)来处理这个问题。希望能够拥有一个代码来“统治所有人”。

请注意,我不是C开发人员。

所以我不知道“C标准库”或POSIX库。

我的问题

我如何以跨平台的方式发现正在运行的进程列表? JNA可能会这样做吗?从哪个库(如果不是C标准库)调用哪些函数?

非常感谢您的建议和反馈。

1 个答案:

答案 0 :(得分:1)

另一个post linked in the comments列出了命令行ps(对于* nix)和taskinfo(对于Windows)作为最简单的方法。它没有使用JNA,但它可以毫不费力地合理可靠地为您提供答案。

我是OSHI project的首席开发人员,它完全按照您对使用JNA的Windows和macOS,以及使用普通Java的Linux(一个遵循动态链接的JNA功能)和两个Unix风格(Solaris和FreeBSD)解析ps。源代码在该网站上供您随意阅读,或者您可以简单地将该项目用作依赖项;您可以在getProcesses()接口的特定于平台的实现中找到OperatingSystem方法。

简短的回答是,虽然你可以使用JNA,但这不是强制性的。在OSHI中,我使用JNA的Platform类来确定您正在运行的系统(尽管这只是解析System.getProperty("os.name")的结果)并根据您所在的平台,分支到平台 - 特定代码。

对于Linux,您只需阅读/proc目录;该目录中的每个数字文件都代表一个进程,并在目录树中包含统计信息。这不使用JNA,但比试图解析ps命令的C源代码要快得多,这基本上会导致相同的底层信息。

对于Unix,解析ps是最好的答案。 -o标志允许您指定要包含的字段。

对于Windows,您可以使用Windows Process and Thread Functions(其中大部分已在JNA中实现)或使用PSAPI functions通过JNA as shown here,但返回的信息有限且需要很多跳过箍来获取细节,其中一些需要提升权限。可以通过JNA中的COM接口查询WMI以获取一个查询中的所有信息。 OSHI使用注册表从WMI最终调用的相同位置获取大部分信息。

对于macOS X,您可以使用proc_listpids()功能获取进程ID并将其提供给proc_pidinfo()。它们位于System框架中,因此JNA用于在Java中实现C调用。