【问题标题】:Kill / Stop an application with Java Code使用 Java 代码终止/停止应用程序
【发布时间】:2012-01-13 17:25:01
【问题描述】:

是否可以使用 java 代码在 Windows 中停止应用程序? 我想创建一个程序,它就像在我的电脑上停止应用程序的快捷方式。是否可以使用 ProcessBuilder ?谢谢你

【问题讨论】:

  • 我过去通过使用 Runtime.exec 包装对 pskill Windows 实用程序的调用(不知道该实用程序是否仍然存在)来完成此操作。但是我不知道操作系统对 pskill 做出了哪些保证。 Windows 上的 AFAICT 与 Unx 上的不同。在 Unx 上发出 SIGKILL 意味着程序必须立即退出,并且它的所有资源必须归还给操作系统(这是理论,在实践中效果很好)。
  • TerminateProcess 和 NtTerminateProcess 类似于在 NT 中发送 SIGKILL - 也就是说,它请求操作系统“立即”终止进程,尽管(对于 Linux 和 Windows,可能是大多数 *nix)这可能是由于进程访问某些系统资源(例如永远不会返回的 IO 调用)而延迟。类似于 Windows 中的 SIGTERM 是向应用程序的窗口发送 WM_CLOSE 窗口消息,除非应用程序是服务。在这种情况下,将 ControlService 与 dwControl = SERVICE_CONTROL_STOP 一起使用。

标签: java process kill


【解决方案1】:

纯Java,没有本地访问?没有。

ProcessBuilder 允许您控制从 Java 应用程序中启动的进程,但它不能让您控制由其他进程启动的进程。

根据用户988052的评论,您可以使用Sysinternals Suite中的pskill通过Runtime.exec完成此操作。 pskill 使用 TerminateProcess 函数调用。您也可以使用 JNI(或其他一些本机调用程序,如 JNA、NLink 等)调用此函数,但您需要通过 OpenProcess 函数调用获取进程句柄。

【讨论】:

  • 如果您使用 OpenProcess,请务必在 dwDesiredAccess 中请求 PROCESS_TERMINATE (0x0001)。
【解决方案2】:

是否可以使用 java 代码在 Windows 中停止应用程序? ... 可以使用 ProcessBuilder 吗?

仅当您从尝试填充该应用程序的同一 Java 应用程序启动该应用程序时。

除此之外,您需要求助于运行特定于 Windows 的命令来执行杀戮……或基于 JNI 的东西来进行本地 Windows 库调用。

其他复杂情况是您可能由于权限问题而无法杀死某些进程,并且某些进程可能会拒绝被杀死。

【讨论】:

    【解决方案3】:

    我相信 JRE 没有为系统进程提供 API。 ProcessBuilder 可以创建 系统进程,但它不能为您在 JVM 之外创建的进程提供 Process 对象。我相信这是 Java 人员的一个哲学决定,尽可能避免某些特定于操作系统的任务。您可能会认为每个操作系统都有 pid,或者它们都有某种终止消息,但 Java 可以在很多操作系统上运行,其中一些很奇怪。

    您可以编写本地代码来执行此操作并使用 JNI 进行包装,但这会很浪费。正如 988052 先生所说,我建议您通过Runtime.execProcessBuilder 执行系统特定命令。您需要决定要支持哪些操作系统,并确保为每个操作系统获取正确的命令(和操作系统检测代码)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-03
      • 2014-09-06
      • 1970-01-01
      • 2017-08-10
      • 1970-01-01
      • 2013-03-13
      相关资源
      最近更新 更多