Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在跨平台环境中使用JNA获取Java中正在运行的进程列表?_Java_Cross Platform_Jna - Fatal编程技术网

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

如何在跨平台环境中使用JNA获取Java中正在运行的进程列表?,java,cross-platform,jna,Java,Cross Platform,Jna,我需要监视跨平台环境中的服务器:Windows、Unix(Aix、Solaris)和Linux。这意味着:获取进程,查找一些文件 因此,为了解决这个问题,我将重点放在JNA(Java本机访问)上。希望能够有一个代码来“统治所有人” 请注意,我不是C开发人员 例如,我不知道“C标准库”或POSIX库 我的问题是: 如何以跨平台的方式发现正在运行的进程列表?JNA有可能这样做吗?调用哪个函数,从哪个库(如果不是C标准库) 非常感谢您的建议和反馈。另一个列出了命令行ps(对于*nix)和taskinf

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

因此,为了解决这个问题,我将重点放在JNA(Java本机访问)上。希望能够有一个代码来“统治所有人”

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

例如,我不知道“C标准库”或POSIX库

我的问题是:

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

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

另一个列出了命令行
ps
(对于*nix)和
taskinfo
(对于Windows)作为最简单的方法。它不使用JNA,但它可以合理可靠地为您提供答案,而且不需要太多麻烦

我是该软件的首席开发人员,它使用JNA完全满足Windows和macOS的要求,Linux使用纯Java(一个JNA函数跟踪动态链接)和两种Unix风格(Solaris和FreeBSD)解析
ps
。源代码在该站点上供您在空闲时仔细阅读,或者您可以简单地将该项目作为依赖项使用;您可以在
操作系统
界面的特定于平台的实现中找到
getprocesss()
方法

简单的回答是,虽然可以使用JNA,但它不是强制性的。在OSHI中,我使用JNA类来确定您运行的是哪个系统(尽管这只是简单地解析
system.getProperty(“os.name”)
)的结果),并根据您所处的平台,分支到特定于平台的代码

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

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

对于Windows,您可以使用Windows(其中大多数已经在JNA中实现)或使用via JNA,但返回的信息有限,需要大量跳转才能获得详细信息,其中一些需要提升权限。可以通过JNA中的COM接口查询WMI,以便在一次查询中获得所有信息。OSHI使用注册表从WMI最终调用的同一位置获取大部分信息


对于macOS X,您可以使用
proc_-listpids()
函数获取进程ID并将其提供给
proc_-pidinfo()
。这些都在系统框架中,因此JNA用于在Java中实现C调用。

请参阅我已经分析了本文,并且仅在Windows环境中提到JNA的使用。这是否意味着JNA没有必要以跨平台的方式做我想做的事情?最糟糕的是:这是否意味着在UX平台上根本无法做到这一点?流程控制和监控对于任何给定的平台都是独一无二的,因此您必须编写特定于平台的代码才能做到这一点(至少对于JNA而言)。您可能会找到一个库,它使用JNA为流程控制提供了某种通用的API,但流程控制的细节因平台而异。对这个话题有很大的启示。如果您的OSHI projet已经支持*nix(Linux除外)平台,我可能会立即打开。信息方面,我需要提供在Aix、Solaris和misc other*nix上运行的软件。太糟糕了。如果其他*nix平台使用/proc文件系统,那么您可以调整与Linux模块相同的代码。AIX和Solaris都使用procfs,因此我为Linux编写的代码将适用于它们。。。不是即插即用,而是足以让您构建自己的解决方案,所以我认为这回答了您的问题。您可以随时加入该项目并提供Aix和Solaris端口。。。我相信大多数Linux代码实际上都可以工作。:)@SylvainR仅供参考,我已经将OSHI移植到FreeBSD和Solaris,并在这里更新了我的答案。没有访问AIX的权限,但很乐意尝试与有访问权限的人合作,以查看需要更改的内容。