[英]Does anyone here know a good, cross-platform way to get the process list?
好吧,我和一位朋友談了一下Ada(我是這里的當地支持者),在他的項目中,他很痛苦地試圖讓Java(使用JNI)在客戶機上運行應用程序(只有Windows) ,Mac和Linux)獲取應用程序列表。
我根本不熟悉Mac,而我的Linux經驗主要是學術界的用戶端。
所以,我的問題是:有沒有人知道一個很好的跨平台方式來獲取進程列表?
我的解決方案是使用帶有通用函數的package
規范,以Java期望的方式返回列表,並為每個平台拋出三個不同的主體,根據該系統獲取進程列表並編譯(結果) )單獨為這些目標提供三個二進制文件。
有沒有[好]的方式來做它而不是訴諸三個不同的版本? (這是一個Ada問題,但歡迎使用Java解決方案。)
JavaSysMon可以以獨立於平台的方式提供正在運行的進程列表(以及其他系統信息)。 目前它支持Mac OS X,Linux,Windows和Solaris。 作為額外的獎勵,它是BSD許可的。
你只想獲得一個正在運行的進程列表嗎?
如果是這樣,你可以通過谷歌的命令得到這個(1)運行程序的操作系統的名稱,然后(2)運行Runtime.getRuntime.exec(stringCommandToGetProcessList);
基於#1,輸出結果。
每個操作系統都不需要不同的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
你幾乎是在Ada的解決方案。 因為你只想要執行一個程序並查看系統調用(linux / unix中的top / ps),我建議一個單獨的程序。 它將存在於自己的目錄中,並且只能通過正確的編譯(per os)引用。 至於每個操作系統的實際命令,這不是我的答案的一部分。
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下運行)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.