Java ProcessBuilder process.destroy()不会在winXP中杀死子进程

时间:2009-04-29 09:33:52

标签: java

我有一个使用ProcessBuilder准备操作系统命令并给我一个Process对象的java应用程序。 (实际的os命令是使用cygwin通过ssh进行rsync)。

这在Windows中运行良好,但是如果我想使用process.destroy()停止进程,它不会杀死子ssh和rsync进程..... 我必须使用Windows任务管理器手动终止它们。

在调用OutputStream之前,是否有可能获得进程的destroy();并以某种方式发送ctrl-c?

如果有人对某种解决方法有任何想法,那就太好了。 谢谢, d

2 个答案:

答案 0 :(得分:5)

我还认为模拟Ctrl-C以完全杀死ssh是有问题的。

我会做什么,是以下方法之一。要么使用Windows命令来找出谁是ssh的儿子(这有点问题,因为你需要知道你当前的pid才能收到你自己的子进程)。我相信sysinternals的pstools是一个很好的命令行工具,可以让你跟踪孤儿进程。请参阅this example以使用taskList.exe(可以以CSV格式BTW输出其输出)或执行特殊的VBScript来控制Windows进程。

第二种方法是使用诸如winp之类的java库来执行和控制ssh进程。我相信如果发送正确的信息是不够的,你可以列出所有的孩子并强行杀死他们。这将是我的首选方法。请注意,killRecursively方法完全符合您的要求。

请注意,这些方法不应仅呈现您的应用程序窗口。您可以将这些封装在一个在Windows和Linux机器上运行不同的类中。

请注意我没有尝试对Windows进程进行细粒度控制,所以我不确定我找到的解决方案有多成熟。

答案 1 :(得分:0)

我不确定Process.destroy()在幕后做什么(发送信号或类似信号?)。

您可能会发现更好的方法是在shell脚本中调用您的ssh / rsync,并在stdout上返回一个进程ID,然后当您想要终止该进程时,执行/bin/kill进程ID。有点凌乱,但也许更可靠。

注意你可以使用SIGTERM /bin/kill,如果特别顽固,可以使用SIGKILL。