Как получить информацию об использовании памяти и времени процессора для процесса, выполняемого с помощью ProcessBuilder? - PullRequest
0 голосов
/ 05 июля 2018

Я выполняю скрипты Python / Perl на Java, используя processBuilder. Я хочу знать использование памяти и процессорного времени для выполняемого процесса. Java MX Bean ограничен JVM. Следовательно, я не думаю, что это может быть использовано для выполнения скриптов. Пожалуйста, помогите.

1 Ответ

0 голосов
/ 05 июля 2018

Если вы используете Java 9 или новее, используйте Process::info(), чтобы получить объект ProcessHandle.Info для процесса (если имеется). В зависимости от того, что JVM поддерживает на вашей платформе ОС, это может дать вам общее время ЦП для процесса и время запуска процессов ... которое вы можете использовать для вычисления истекшего времени при некоторых обстоятельствах.


Другая альтернатива в системе Linux - выполнить команду как «/ usr / bin / time your command» и проанализировать последние три строки стандартного вывода, чтобы получить истекшее время, «пользовательское» время ЦП и «система» Процессорное время

Например:

$ time date
Thu Jul  5 20:25:01 AEST 2018

real    0m0.002s
user    0m0.001s
sys     0m0.001s

Захват и анализ последних 3 строк. (Реализация этого в Java оставлена ​​в качестве упражнения ...)

Версия GNU для команды time имеет параметры, которые также могут использоваться для отображения использования памяти. Это описано в руководстве пользователя.

Некоторые эквивалентные команды для Windows описаны здесь:


Для записи, это (грубо говоря) способ использования time с использованием ProcessBuilder:

   ProcessBuilder pb = new ProcessBuilder(
           "sh", "-c", "/usr/bin/time python filename.py");

или

   ProcessBuilder pb = new ProcessBuilder(
           "/usr/bin/time python filename.py");

Если вы собираетесь запускать команды в подоболочке, используя "sh -c", входная строка оболочки должна быть единственным аргументом команды . Поскольку ProcessBuilder не понимает цитирование, это означает, что вы должны выполнить разбиение самостоятельно; см. выше.

Чтобы получить GNU время для вывода параметров памяти, вам нужно использовать строку формата, как описано в «man time»; например, * +1036 *

  /usr/bin/time -f "%e %s %u %M" command to be run

Обратите внимание, что важно использовать "/ usr / bin / time" вместо "time", поскольку встроенная команда "time" в некоторых оболочках не понимает опцию "-f".

...