Как приостановить процесс, используя Java ProcessBuilder.start ()? - PullRequest
2 голосов
/ 02 июня 2011

Хорошо, поэтому я пишу эту программу, которая по сути запускает для меня другие Java-программы (несколько раз, различные параметры, параллельное выполнение и т. Д.).

Пока бегущая часть работает отлично. Используя метод .start () ProcessBuilder (я полагаю, эквивалентен Runtime.exec ()), он создает отдельный процесс Java и отключается.

Проблема в том, что я хотел бы иметь возможность приостановить / остановить эти процессы после их запуска. С простыми потоками это, как правило, легко сделать, однако внешний процесс, похоже, не имеет встроенных функций для ожидания / ожидания, по крайней мере, с внешней точки зрения.

Мой вопрос (ы) заключается в следующем: есть ли способ приостановить объект java.lang.Process? Если нет, кто-нибудь знает какие-либо связанные библиотеки exec, которые содержат эту возможность? За исключением всего этого, является ли расширение Process более жизнеспособной альтернативой?

Ответы [ 3 ]

3 голосов
/ 02 июня 2011

Мой вопрос (ы) заключается в следующем: есть ли способ приостановить объект java.lang.Process?

Каквы, вероятно, обнаружили, что нет поддержки в стандартном API.Например, Process не предоставляет методов suspend() / resume().

Если нет, кто-нибудь знает о каких-либо связанных библиотеках exec, которые содержат эту возможность?

В POSIX-совместимых операционных системах, таких как GNU / Linux или Mac OS, вы можете использовать другой системный вызов (используя Runtime.exec, ProcessBuilder или некоторую встроенную библиотеку) для выдачиКоманда kill.

С помощью команды kill вы можете отправлять такие сигналы, как SIGSTOP (для приостановки процесса) и SIGCONT (для его возобновления).

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

2 голосов
/ 02 июня 2011

Вам нужно будет создать систему для отправки сообщений между процессами. Вы можете сделать это:

  1. Отправка сигналов , в зависимости от ОС. (Как отмечает aioobe.)
  2. Наличие одного процесса иногда проверяет наличие / отсутствие файла, который другой процесс может создать / удалить. (Если файл читается / записывается, вам необходимо использовать блокировку файла.)
  3. Пусть ваш «основной» процесс прослушивает порт, и когда он запускает дочерние элементы, он говорит им (посредством аргумента comamnd-line), как «позвонить домой» при запуске. Обе программы чередуются между выполнением работы и проверкой сообщений.

Из того, что вы описали (все Java-программы в сложной пакетной среде), я бы предложил # 3, связь TCP / IP.

Хотя это, безусловно, требует дополнительной работы, оно также дает вам гибкость в отправке команд или информации любого типа между различными процессами.

0 голосов
/ 02 июня 2011

Процесс представляет собой отдельный процесс, выполняющийся на машине. Java определенно не позволяет вам приостанавливать их через java.lang.Process. Вы можете принудительно остановить их, используя Process.destroy () . Для приостановки вам понадобится содействие порожденного процесса.

Какие это процессы? Вы их написали?

...