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

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

Я совсем не знаком с Mac, и мой опыт работы с Linux в основном связан с академическими кругами.

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

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

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


person Shark8    schedule 18.10.2011    source источник
comment
Java упоминается только потому, что это часть существующей проблемы, то есть решения, которое используется. Хотя ответы, ориентированные на Java, приветствуются (и поощряются), меня очень интересует ответ, ориентированный на Ада, поскольку проблема вызвала у меня интерес, а Ада настолько высокоуровневая, что я чувствую, что мне что-то не хватает в моей кишке/ первоначальный подход.   -  person Shark8    schedule 18.10.2011
comment
Опубликовано в comp.lang.ada.   -  person trashgod    schedule 18.10.2011
comment
Мне было интересно, если бы я упомянул, что разместил это там тоже ... Я думаю, это не повредило бы.   -  person Shark8    schedule 18.10.2011
comment
+1 за интересный вопрос; cla обычно ведет хорошую дискуссию; Я уступаю вам, нужно ли добавлять тег java; для этого может быть кроссплатформенная структура, о которой я не знаю.   -  person trashgod    schedule 18.10.2011
comment
Я боюсь, что это действительно больше проблема ОС, чем проблема языка. Ада — это язык, который пытается инкапсулировать многое из того, что другие языки оставляют для ОС, но я боюсь, что тяжеловесные процессы выходят за рамки его возможностей.   -  person T.E.D.    schedule 18.10.2011


Ответы (5)


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

person NWS    schedule 18.10.2011
comment
Ах, спасибо. Это, вероятно, самый правильный ответ, учитывая, как я сформулировал вопрос. - person Shark8; 19.10.2011

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

person trashgod    schedule 18.10.2011

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

Вики

JavaDocs

person jt.    schedule 18.10.2011

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

Если это так, вы можете просто погуглить команды, чтобы получить это (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
person jefflunt    schedule 18.10.2011
comment
Хм, я думаю, была причина, по которой они не могли этого сделать; Я не знаю, что это такое, поскольку я получил только исполнительную версию жалобы. - person Shark8; 18.10.2011
comment
Обратите внимание, что параметры ps и top зависят от платформы. - person trashgod; 18.10.2011
comment
Разве они не хотели анализировать вывод указанных команд? Regex — ваш друг. :) - person jefflunt; 18.10.2011
comment
Я думаю, что все, что их интересует, это PID и приложение... это для пакета совместного использования рабочего стола/приложений (IIUC), и поэтому я предполагаю, что им просто нужен способ захватить все «интересные» приложения (вероятно, их собственную процедуру фильтрации), которую они затем передают некоторому пользовательскому методу ввода/выбора, который даст им главное окно указанной программы. - person Shark8; 18.10.2011
comment
регулярное выражение НЕ мой друг; Я видел, как «простой» синтаксический анализ в спешке терпел неудачу, потому что они думали, что регулярное выражение подходит, но как только все становится умеренно сложным (скажем, потребности меняются, или, что более вероятно, кто-то замечает, что регулярное выражение не работает со специальным случай), я нахожу, что это становится обременительным. (Мой опыт.) - person Shark8; 18.10.2011
comment
Сочувствие; У меня возникло бы искушение awk нужных мне столбцов в командной строке. - person trashgod; 18.10.2011
comment
@trashgod - Да. Я представляю сценарий awk для конкретной платформы, выводящий данные в стандартном (документированном) формате для программы Ada/Java. - person T.E.D.; 18.10.2011

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

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

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

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

person T.E.D.    schedule 18.10.2011
comment
+1 Я забыл о JGNAT. - person trashgod; 18.10.2011