Java ProcessBuilder process.destroy () не убивает дочерние процессы в winXP - PullRequest
9 голосов
/ 29 апреля 2009

У меня есть приложение Java, которое использует ProcessBuilder для подготовки команды операционной системы и дает мне объект Process. (Фактическая команда os - rsync поверх ssh с использованием cygwin).

Это хорошо работает в Windows, однако, если я хочу остановить процесс с помощью process.destroy(), это не приведет к остановке дочерних процессов ssh и rsync ..... Я должен вручную убить их с помощью диспетчера задач Windows ..

Можно ли получить OutputStream процесса и как-то отправить ctrl-c, прежде чем я вызову destroy();?

Если у кого-нибудь есть идеи по поводу обходного пути, было бы замечательно. Спасибо, D

Ответы [ 2 ]

5 голосов
/ 29 апреля 2009

Я также думаю, что эмуляция Ctrl-C для полного уничтожения ssh проблематична.

Что бы я сделал, это один из следующих подходов. Либо используйте команды windows, чтобы узнать, кто являются сыновьями ssh (что немного проблематично, так как вам нужно знать текущий pid для получения ваших собственных дочерних процессов). Я считаю, что pstools sysinternals - хороший инструмент командной строки, который должен позволить вам отслеживать потерянные процессы. См. этот пример для управления процессами Windows либо с taskList.exe (который может дать вам свой вывод в формате CSV BTW), либо с помощью специального VBScript.

Второй подход заключается в использовании библиотеки Java, такой как winp , для выполнения и управления процессом ssh. Я полагаю, что вы сможете перечислить всех его детей и принудительно убить их, если отправка правильного сообщения будет недостаточной. Это был бы мой предпочтительный подход. Обратите внимание, что метод killRecursively делает именно то, что вы хотите.

Обратите внимание, что эти подходы не должны отображать только окна вашего приложения. Вы можете инкапсулировать те из них, которые будут работать по-разному на компьютерах с Windows и Linux.

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

0 голосов
/ 29 апреля 2009

Я не уверен, что Process.destroy () делает под одеялом (отправляет сигнал или что-то подобное?).

Что вам может показаться лучше, так это вызвать ssh / rsync в сценарии оболочки, и он возвращает идентификатор процесса на stdout, а затем, когда вы хотите завершить процесс, выполните /bin/kill с этим идентификатором процесса , Немного грязно, но, возможно, более надежно.

Обратите внимание, что вы можете /bin/kill с SIGTERM и SIGKILL, если он особенно упрямый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...