我有一个java应用程序,用于ProcessBuilder
准备操作系统命令并给我一个Process
对象.(实际的os命令是使用cygwin通过ssh进行rsync).
这在Windows中运行良好,但如果我想停止使用process.destroy()
它的过程不会杀死子ssh和rsync进程.....我必须使用Windows任务管理器手动杀死它们..
我可以OutputStream
在调用之前获取进程并以某种方式发送一个ctrl-c destroy();
吗?
如果有人对解决方法有任何想法,那就太好了.感谢:D
我也认为模拟Ctrl-C以完全杀死ssh是有问题的.
我会做什么,是以下方法之一.要么使用windows命令来找出谁是ssh的儿子(这有点问题,因为你需要知道你当前的pid才能收到你自己的子进程).我相信sysinternals的pstools是一个很好的命令行工具,可以让你跟踪孤儿进程.请参阅此示例以控制Windows进程taskList.exe
(可以以CSV格式BTW提供输出)或执行特殊的VBScript.
第二种方法是使用诸如winp之类的java库来执行和控制ssh进程.我相信如果发送正确的信息是不够的,你可以列出所有的孩子并强行杀死他们.这将是我的首选方法.请注意,killRecursively方法完全符合您的要求.
请注意,这些方法不应仅呈现您的应用程序窗口.您可以将这些封装在一个在Windows和Linux机器上运行方式不同的类中.
请注意我没有尝试对Windows进程进行细粒度控制,因此我不确定我找到的解决方案有多成熟.