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

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

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

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

如果有人对解决方法有任何想法,那就太好了。 感谢:D

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

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

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

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

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

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

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

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