有没有人知道一个良好的,跨平台的方式来获取进程列表?

时间:2011-10-18 01:17:04

标签: java portability ada

好的,我和一位朋友谈了Ada(我是这里的当地支持者),在他的项目中,他很痛苦地试图让Java(使用JNI)在客户端计算机上运行应用程序(仅限Windows,Mac和Linux)获取应用程序列表。

我根本不熟悉Mac,我的Linux经验主要是学术界的用户端。

所以,我的问题是:有没有人知道一个很好的跨平台方式来获取进程列表?

我的解决方案是使用带有通用函数的package规范,以Java期望的方式返回列表,并为每个平台抛出三个不同的主体,这些平台将根据以下内容获取进程列表:该系统并单独为这些目标编译(结果)三个二进制文件。

有没有[好]的方法来做这个而不是诉诸三个不同的版本? (这是一个Ada问题,但欢迎使用Java解决方案。)

5 个答案:

答案 0 :(得分:3)

Java没有跨平台API来列出正在运行的进程。可以使用ProcessBuilder来执行ps命令,如herehere所示。在GNAT中,Ada中的(粗略)等价物将是GNAT.Os_Lib.Spawn。我不确定其他实现。

答案 1 :(得分:1)

您只想获取正在运行的进程列表吗?

如果是这样,您可以通过Google命令获取此命令(1)运行程序的操作系统的名称,然后(2)基于#1运行Runtime.getRuntime.exec(stringCommandToGetProcessList);,并输出结果

每个操作系统都不需要不同的Java二进制文件。你只需要一个。只需谷歌查找操作系统名称/版本的命令,以及获取正在运行的应用程序列表的命令。

您也不需要JNI来执行此操作。使用Runtime类来运行命令,就像它们在命令行上一样。

没有跨平台的方法,因为每个操作系统上的命令都不同。但是,由于只有三个主要操作系统(可能有十几个你想要支持,在一些疯狂的极端例子中),所以只需要列出12个不同的命令就可以了。

在Mac上,以及许多Linux版本,操作系统名称/版本:

$ uname -a
Darwin normalocity 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun  7 16:32:41 PDT 2011; root:xnu-1504.15.3~1/RELEASE_X86_64 x86_64

运行流程(按最高使用率):

$ top
Processes: 92 total, 5 running, 87 sleeping, 408 threads                                                          20:38:35
Load Avg: 0.18, 0.20, 0.17  CPU usage: 7.26% user, 1.95% sys, 90.78% idle
SharedLibs: 6272K resident, 7300K data, 0B linkedit. MemRegions: 12204 total, 730M resident, 29M private, 393M shared.
PhysMem: 1076M wired, 1184M active, 1859M inactive, 4119M used, 4062M free.
VM: 207G vsize, 1041M framework vsize, 1851231(0) pageins, 603(0) pageouts.
Networks: packets: 1727104/1746M in, 984226/269M out. Disks: 295257/6745M read, 397634/15G written.

PID    COMMAND      %CPU TIME     #TH   #WQ  #PORT #MRE RPRVT  RSHRD  RSIZE  VPRVT  VSIZE  PGRP  PPID  STATE    UID
12547  top          3.5  00:00.26 1/1   0    24    34   1208K  264K   1784K  17M    2378M  12547 12217 running  0
12217  bash         0.0  00:00.08 1     0    17    25   1328K  856K   1988K  17M    2378M  12217 12211 sleeping 502
12212  bash         0.0  00:00.08 1     0    17    25   1276K  856K   1980K  9688K  2378M  12212 12200 sleeping 502
12211  login        0.0  00:00.01 1     0    22    54   512K   312K   1648K  11M    2379M  12211 12196 sleeping 0
12202  bash         0.0  00:00.07 1     0    17    25   1276K  856K   1980K  9688K  2378M  12202 12199 sleeping 502
12201  bash         0.0  00:00.07 1     0    17    25   1276K  856K   1980K  9688K  2378M  12201 12198 sleeping 502
12200  login        0.0  00:00.01 1     0    22    54   512K   312K   1648K  11M    2379M  12200 12196 sleeping 0
12199  login        0.0  00:00.01 1     0    22    54   512K   312K   1648K  11M    2379M  12199 12196 sleeping 0
12198  login        0.0  00:00.01 1     0    22    54   512K   312K   1648K  11M    2379M  12198 12196 sleeping 0
12196  Terminal     33.9 00:01.84 5     1    114-  137  5736K+ 32M    23M+   90M    2768M  12196 300   sleeping 502
11803- Google Chrom 0.0  04:06.79 7     1    99    365  45M    84M    79M    112M   1199M  11788 11788 sleeping 502
11800- Google Chrom 0.0  00:00.25 7     1    98    215  9632K  77M    23M    110M   1090M  11788 11788 sleeping 502
11799- Google Chrom 0.0  00:07.92 7     1    99    288  25M    82M    43M    109M   1108M  11788 11788 sleeping 502
11797- Google Chrom 0.0  00:01.49 7     1    99    316  27M    81M    48M    111M   1109M  11788 11788 sleeping 502
11796- Google Chrom 0.0  00:00.44 4     1    91    115  2824K  65M    8304K  96M    1012M  11788 11788 sleeping 502
11795- Google Chrom 0.0  00:00.96 7     1    98    215  9172K  77M    23M    111M   1091M  11788 11788 sleeping 502
11794- Google Chrom 0.0  00:07.64 8     1    100   294  20M    75M    36M    113M   1101M  11788 11788 sleeping 502
11793- Google Chrom 0.0  00:01.42 8     1    95    185  9732K  73M    24M    104M   1057M  11788 11788 sleeping 502
11788- Google Chrom 0.6  04:04.31 30    1    307   390  61M    110M   96M    254M   1298M  11788 300   sleeping 502
4328   ssh-agent    0.0  00:00.19 2     1    33    63   1300K  396K   2688K  59M    2420M  4328  300   sleeping 502
3855-  Microsoft Of 0.0  00:36.14 4     1    121   337  12M    30M    22M    93M    1027M  3855  300   sleeping 502
492    AppleSpell   0.0  00:10.56 2     1    34    72   4608K  9028K  10M    88M    2469M  492   300   sleeping 502

答案 2 :(得分:1)

你在Ada解决方案中几乎。因为你只需要1个程序来执行&看看系统调用(linux / unix中的top / ps)我会建议separate程序。它将存在于自己的目录中,并且只能通过正确的编译(per os)引用。至于每个操作系统的实际命令,这不是我的答案的一部分。

答案 3 :(得分:1)

Ada在语言中并没有“过程”的概念。事实上,Ada代码可以在不支持繁重流程的平台上运行(例如:许多小型嵌入式平台,如vxWorks)。

这意味着您将不得不使用某种API(最有可能由您的操作系统提供)来获取该信息。

如果您的操作系统支持POSIX,您可以使用像Florist这样的Posix绑定来获取该信息。 Windows(Cygwin)有完整的Unix子系统,我相信MacOS是基于Unix的。所以有可能使用Unix作为一种通用语言,这样你就可以从一个(POSIX)API获取你的过程信息。

现在Java涉及到两个问题:Java语言和Java平台(JVM)。 Java语言的粉丝喜欢将两者混为一谈,但实际上有Ada编译器以JVM为目标,他们可以调用与Java语言编写的代码相同的JVM API。如果有一个允许Java程序获取JVM知道的所有线程或进程的列表,那么您也可以从Ada调用相同的例程(如果它也在JVM下运行)。

答案 4 :(得分:1)

JavaSysMon可以以独立于平台的方式提供正在运行的进程列表(以及其他系统信息)。目前它支持Mac OS X,Linux,Windows和Solaris。作为额外的奖励,它是BSD许可。

Wiki

JavaDocs