5

我有一个实际上是 Java 应用程序的外部 Windows .exe:运行 .exe 会启动 javaw.exe,而后者又会运行该 Java 应用程序。

我没有编写该应用程序,也无法通过 API 访问它。但是,我需要能够杀死它。所以现在我只是杀死 Windows 进程 javaw.exe,这对于只运行该 Java 应用程序的测试机器来说很好,但如果我需要更精细的粒度,我目前不能这样做。

我的搜索产生了一些建议,例如Sysinternal 的 Process Explorer或 JDK 中的 jps 命令,但是在我打算为其提供脚本的目标系统中,JDK 和 Sysinternal 的 Process Explorer 都无法运行。

还有其他不需要外部工具的方法吗?javaw.exe 是否具有列出 Java 进程的开关或命令行选项?有jps的JRE版本吗?

谢谢。

4

6 回答 6

3

The JDK (and possibly the JRE) ship with a utility called jps which can list all Java processes but also tell you the Main-Class currently running in that JVM. If JMX/JConsole is not an option, simply parsing the output of "jps -ml" and killing the appropriate process may work.

于 2010-09-13T11:23:17.597 回答
3

我仍然建议只杀死 javaw.exe。

我看不到缺点,因为它毕竟是你想要杀死的过程。

请记住,如果您在机器上运行多个应用程序,它们应该都有一个单独的 JVM 实例。因此,如果需要,您仍然可以终止特定应用程序。

于 2010-09-12T19:01:14.063 回答
2

如果要杀死整个 JVM,只需杀死 javaw.exe 进程即可。在 JVM 中可以有多个 Java线程,但除非应用程序的开发人员提供了这样做的方法,否则无法进入 JVM 并终止线程。

于 2010-09-12T19:05:12.290 回答
1

Based on your comment, multiple javaw.exe programs are running and you need to know which one to kill.

You might want to try connecting to each of the processes with JConsole and inspect the JVM. There may be enough clues to determine which one to kill. Once you've identified the profile of your application, you should be able to script the logic to make it easier in the future (use JMX to get most of the information provided by JConsole).

于 2010-09-13T11:14:24.920 回答
0

如果可执行文件启动 javaw 然后退出而不提供任何进一步的信息,您似乎需要使用脚本语言在启动可执行文件之前和可执行文件完成后拍摄机器上正在运行的进程的快照。然后你就可以推断出哪个是新的 javaw 进程。您使用的是什么脚本语言?

于 2010-09-13T11:34:01.727 回答
0

另一种方法:如果你有 jdk,bin 文件夹中有一个名为 jvisualVM 的程序。它有关于每个正在运行的 JVM 上下文的很好的信息。您可以看到的其中一件事是 VM 的 PID,我使用它来使用任务管理器在 Windows 中终止进程(在 Windows 上,PID 默认情况下不显示,但您可以通过进入 view -> show 轻松启用该列列 )

于 2012-03-12T08:11:41.247 回答