«Убить дерево процессов» на окнах с помощью Java - PullRequest
5 голосов
/ 26 сентября 2011

У меня есть процесс веб-запуска Java, который является частью пакетного скрипта Windows. В этом случае я использую команду javaws в пакетном скрипте. Этот скрипт соответствия (start.bat) запускается программно с помощью «apache commons exec». При некоторых условиях java-процесс, вызываемый javaws, зависает, и мне придется убить весь поток процесса, начиная с пакетного скрипта start.bat. Существует ли программный способ уничтожения всего дерева процессов с помощью Apache Commons Exec?

Я пытался использовать "execWatchdog.destroyProcess ();" на сценарии "start.bat". Однако он убивает только процесс start.bat, а не все дерево процессов.

Есть ли способ уничтожить все дерево процессов с помощью apache-commons-exec или аналогичного кода?

Я видел этот вопрос Выполнение эквивалента "Kill Process Tree" в c ++ для windows , который выполняет эквивалентную задачу в c ++. Мне интересно, если кто-нибудь реализовал вызовы Windows родные системные вызовы через JNI.

Ответы [ 3 ]

8 голосов
/ 02 октября 2011

Наконец-то получил что-то работоспособное, хотя это окольным путем.

API Apache Commons Exec содержит класс CommandLauncher, который возвращает объект java.lang.Process. Благодаря ссылке

Здесь ссылка для получения идентификатора процесса Windows из java.lang.Process. Это использует библиотеки JNA.

Наконец, с идентификатором процесса, здесь командная строка, которая убивает дерево процессов // String killCmd = "taskkill / F / T / PID" + JNAHandler.getPid (process);

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

К сожалению, как вы обнаружили, не существует чистого Java-способа сделать это.Вам придется прибегнуть к нативным командам или библиотекам JNI, которые все зависят от платформы и являются более сложными, чем было бы решение на чистом Java.

Возможно, стоит проголосовать за соответствующую ошибку в базе данных ошибок Java: http://bugs.sun.com/view_bug.do?bug_id=4770092

Если повезет, мы сможем убедить разработчиков Java, что плохая обработка подпроцессов стоит исправить для Java 8.

1 голос
/ 26 сентября 2011

Насколько я знаю, в commons-exec такой опции нет.Даже невозможно получить PID любого процесса, который вы только что начали.Вы можете trap сигнал уничтожения в вашем bash-скрипте, и обработчик может уничтожить подпроцесс (ы) при завершении процесса скрипта.

...