Как убить подпроцессы процесса Java? - PullRequest
5 голосов
/ 04 мая 2011

Я создаю процесс P1 с помощью Process P1= Runtime.exec(...).Мой процесс P1 создает другой процесс, скажем P2, P3 ....

Затем я хочу убить процесс P1 и все процессы, созданные P1, т.е. P2, P3 ...

P1.destroy() убивает только P1, а не его подпроцессы.

Я также прогуглил его и обнаружил, что это ошибка Java: http://bugs.sun.com/view_bug.do?bug_id=4770092

У кого-нибудь есть идеи, как это сделать?

Ответы [ 5 ]

3 голосов
/ 04 мая 2011

Да, это ошибка, но если вы прочитаете оценку, то основная проблема заключается в том, что практически невозможно реализовать «убить всех маленьких детей» в Windows.

Ответ таков: P1 должен нести ответственность за собственную уборку.

1 голос
/ 04 мая 2011

Java не предоставляет никакой информации о процессах внукам по уважительной причине. Если ваш дочерний процесс запускает другой процесс, то дочерний процесс должен управлять ими.

Я бы предложил либо

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

Рекомендует @Giacomo предложить мне IPC.

0 голосов
/ 04 мая 2011

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

0 голосов
/ 04 мая 2011

Поскольку Runtime.exec () возвращает экземпляр Процесс , вы можете использовать некоторый массив для хранения их ссылки и позднее уничтожить их с помощью Process.destroy () .

0 голосов
/ 04 мая 2011

Вы пишете код других процессов, или они являются чем-то, что вы не можете изменить?

Если вы можете, я бы подумал изменить их так, чтобы они принимали какие-то сообщения (даже через стандартные потоки), чтобы они хорошопрекратить по запросу, уволив детей, если они имеют, самостоятельно.

Я не считаю этот "процесс уничтожения" чем-то чистым.

...