Кто-нибудь здесь знает хороший, кроссплатформенный способ получить список процессов? - PullRequest
2 голосов
/ 18 октября 2011

Хорошо, я поговорил с другом об Аде (я здесь являюсь его местным сторонником), и в своем проекте ему больно пытаться заставить Java (используя JNI) запускать приложения на клиентском компьютере. (только Windows, Mac и Linux), чтобы получить список приложений.

Я совсем не знаком с Mac, и мой опыт работы с Linux в основном ориентирован на пользователя.

Итак, у меня такой вопрос: кто-нибудь знает хороший кроссплатформенный способ получить список процессов?

Мое решение состояло бы в том, чтобы использовать спецификацию package с общей функцией, возвращающей список так, как этого ожидает Java, и собирать вместе три разных тела для каждой из платформ, которые получат список процессов в соответствии с этой системой. и скомпилируйте (результирующие) три двоичных файла для этих целей по отдельности.

Есть ли [хороший] способ сделать это без использования трех разных версий? (Это вопрос Ады, но приветствуются Java-решения.)

Ответы [ 5 ]

3 голосов
/ 18 октября 2011

Java не имеет кроссплатформенного API для отображения запущенных процессов. ProcessBuilder может использоваться для выполнения команды ps, как показано здесь и здесь . (Грубый) эквивалент в Аде будет GNAT.Os_Lib.Spawn в GNAT. Я не уверен насчет других реализаций.

2 голосов
/ 18 октября 2011

JavaSysMon может предоставлять список запущенных процессов (а также другую системную информацию) независимо от платформы. В настоящее время он поддерживает Mac OS X, Linux, Windows и Solaris. В качестве дополнительного бонуса, он лицензирован BSD.

Wiki

JavaDocs

1 голос
/ 18 октября 2011

Ада на самом деле не имеет понятия "процессы" в языке. Фактически, код Ada может работать на платформах, которые вообще не поддерживают тяжелые процессы (например: Многие небольшие встроенные платформы, такие как vxWorks).

Это означает, что для получения этой информации вам придется использовать какой-то API (скорее всего, предоставляемый вашей ОС).

Если ваша ОС поддерживает POSIX, вы можете использовать привязки Posix, такие как Florist, для получения этой информации. Для Windows (Cygwin) доступны полные подсистемы Unix, и я считаю, что MacOS построен на основе Unix. Так что может быть возможно использовать Unix как своего рода лингва-франка, чтобы вы могли получать информацию о своем процессе из одного (POSIX) API.

Теперь, что касается Java, есть две проблемы: язык Java и платформа Java (JVM). Поклонникам языка Java нравится объединять их, но на самом деле есть компиляторы Ada, предназначенные для JVM, и они могут вызывать все те же API JVM, которые может вызывать код, написанный на языке Java. Если есть такой, который позволяет программам на Java получать список всех потоков или процессов, о которых знает JVM, вы можете вызвать ту же самую процедуру из Ada (если она также работает под JVM).

1 голос
/ 18 октября 2011

Вы были почти в решении Ады. Поскольку вы хотите, чтобы только 1 процедура выполнялась и смотрела на системный вызов (top / ps в linux / unix), я бы предложил отдельную процедуру. Это будет жить в своем собственном каталоге, и на него будет ссылаться только правильная компиляция (per os). Что касается фактических команд per os, это не часть моего ответа.

1 голос
/ 18 октября 2011

Вы просто хотите получить список запущенных процессов?

Если это так, вы можете просто Google команды, чтобы получить это (1) название ОС, на которой запущена программа, затем (2) запустите Runtime.getRuntime.exec(stringCommandToGetProcessList); на основе # 1 и выведите результаты.

Вам не нужен отдельный двоичный файл Java для каждой ОС.Вам нужен только один.Просто введите команду Google, чтобы найти имя / версию ОС, и команду, чтобы получить список запущенных приложений.

Вам также не нужен 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
...