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

Java ProcessBuilder process.destroy()不杀死winXP中的子进程,java,Java,我有一个java应用程序,它使用ProcessBuilder准备一个操作系统命令,并给我一个Process对象。(实际的os命令是使用cygwin的rsync over ssh) 这在Windows中运行良好,但是如果我想使用process.destroy()停止进程,它不会杀死子ssh和rsync进程。。。。。 我必须使用windows任务管理器手动杀死它们 在调用destroy()之前,是否可以获取进程的OutputStream,并以某种方式发送ctrl-c 如果有人对解决方法有任何想法,那

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

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

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

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

我不确定Process.destroy()在封面下做什么(发送信号或类似的?)

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


注意,您可以使用SIGTERM和SIGKILL来
/bin/kill
,如果它特别顽固的话。

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

我要做的是以下方法之一。或者使用windows命令找出谁是ssh的儿子(这有点问题,因为您需要知道当前的pid才能接收自己的子进程)。我相信sysinternals是一个很好的命令行工具,它应该使您能够跟踪孤立进程。请参阅,了解如何使用
taskList.exe
(可以以CSV格式输出)或通过执行特殊的VBScript来控制windows进程

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

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


请注意,我没有尝试使用获得对windows进程的细粒度控制,因此我不确定我找到的解决方案有多成熟。

Ctrl-C是一个终端函数,它向进程id发送信号(SIGTERM?),因此要模拟这一点,您需要进程id并能够发送信号进程。destroy()调用Windows函数TerminateProcess()。winp似乎越来越受欢迎,并且是Hudson的一部分(实际上是为它编写的)。虽然java.net URL不再解析,但原始文章仍然存在于(请注意,其中一些信息是过时的,比如只有32位)。winp的新URL(带有指向mvn和github的链接)为: