好的,我和一位朋友谈了Ada(我是这里的当地支持者),在他的项目中,他很痛苦地试图让Java(使用JNI)在客户端计算机上运行应用程序(仅限Windows,Mac和Linux)获取应用程序列表。
我根本不熟悉Mac,我的Linux经验主要是学术界的用户端。
所以,我的问题是:有没有人知道一个很好的跨平台方式来获取进程列表?
我的解决方案是使用带有通用函数的package
规范,以Java期望的方式返回列表,并为每个平台抛出三个不同的主体,这些平台将根据以下内容获取进程列表:该系统并单独为这些目标编译(结果)三个二进制文件。
有没有[好]的方法来做这个而不是诉诸三个不同的版本? (这是一个Ada问题,但欢迎使用Java解决方案。)
答案 0 :(得分:3)
Java没有跨平台API来列出正在运行的进程。可以使用ProcessBuilder
来执行ps
命令,如here和here所示。在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许可。