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