【问题标题】:Java ProcessBuilder process.destroy() not killing child processes in winXPJava ProcessBuilder process.destroy()不会在winXP中杀死子进程
【发布时间】:2009-04-29 09:33:52
【问题描述】:

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

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

在我调用destroy();之前,是否可以获取进程的OutputStream并发送一个ctrl-c?

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

【问题讨论】:

  • Ctrl-C 是一个终端函数,它向进程 ID 发送信号(SIGTERM?)。因此,要模拟您需要进程 ID 并能够发送信号

标签: java


【解决方案1】:

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

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

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

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

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

【讨论】:

  • winp 似乎越来越受欢迎,并且是 Hudson 的一部分(实际上是为它编写的)。 java.net URL 不再解析,但原始文章仍然存在于weblogs.java.net/blog/kohsuke/archive/2008/03/…(请注意,其中一些信息已过时,例如只有 32 位)。 winp 的新 URL(带有 mvn 和 github 的链接)是:winp.kohsuke.org
【解决方案2】:

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

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

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

【讨论】:

猜你喜欢
  • 2011-09-27
  • 1970-01-01
  • 2013-11-12
  • 2011-02-26
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多