簡體   English   中英

有沒有人知道一個良好的,跨平台的方式來獲取進程列表?

[英]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解決方案。)

Java沒有用於列出正在運行的進程的跨平台API。 ProcessBuilder可用於執行ps命令,如此此處所示。 Ada中的(粗略)等價物是GNAT中的GNAT.Os_Lib.Spawn 我不確定其他實現。

JavaSysMon可以以獨立於平台的方式提供正在運行的進程列表(以及其他系統信息)。 目前它支持Mac OS X,Linux,Windows和Solaris。 作為額外的獎勵,它是BSD許可的。

維基

的JavaDoc

你只想獲得一個正在運行的進程列表嗎?

如果是這樣,你可以通過谷歌的命令得到這個(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM