我需要监控跨平台环境中的服务器:Windows,Unix(Aix,Solaris)和Linux。它意味着:获取进程,找到一些文件,......
所以我专注于 JNA(Java Native Access)来处理这个问题。希望能够拥有一个代码来“统治所有人”。
请注意,我不是C开发人员。
所以我不知道“C标准库”或POSIX库。
我的问题:
我如何以跨平台的方式发现正在运行的进程列表? JNA可能会这样做吗?从哪个库(如果不是C标准库)调用哪些函数?
非常感谢您的建议和反馈。
答案 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调用。