Как убить Java-процесс в Windows, не убивая javaw.exe? - PullRequest
5 голосов
/ 12 сентября 2010

У меня есть внешний Windows .exe, который на самом деле является Java-приложением: при запуске .exe запускается javaw.exe, который, в свою очередь, запускает это Java-приложение.

Я не написал это приложение и не имею доступак нему через API.Однако я должен быть в состоянии убить его.Поэтому сейчас я просто убиваю процесс Windows javaw.exe, что хорошо для тестовой машины, на которой выполняется только это Java-приложение, но если мне нужна более точная детализация, я не могу сделать это в настоящее время.

Мой поиск дал такие предложения, как Sysinternal Process Explorer или команда jps в JDK, но в целевых системах, для которых я собираюсь предоставить сценарий, ни JDK, ни Sysinternal Process Explorer не могут быть запущены.

Есть ли какие-либоДругой способ, который не требует внешнего инструмента?Есть ли в javaw.exe параметр или параметр командной строки, в котором перечислены процессы Java?Есть ли JRE-версия jps?

Спасибо.

Ответы [ 6 ]

3 голосов
/ 13 сентября 2010

JDK (и, возможно, JRE) поставляются с утилитой jps, которая может перечислять все процессы Java, но также сообщать вам о главном классе, который в настоящее время работает в этой JVM. Если JMX / JConsole не является опцией, может просто сработать вывод «jps -ml» и убить соответствующий процесс.

3 голосов
/ 12 сентября 2010

Я бы по-прежнему предлагал просто убить javaw.exe.

Я не вижу обратной стороны, поскольку именно этот процесс вы хотите убить в конце концов.

Помните, что есливы запускаете на компьютере несколько приложений, каждое из которых должно иметь отдельный экземпляр JVM.Таким образом, вы все равно можете убить определенное приложение, если вам нужно.

2 голосов
/ 12 сентября 2010

Если вы хотите уничтожить всю JVM, просто убейте процесс javaw.exe.Внутри JVM может быть несколько Java потоков , но нет возможности совать JVM и завершить поток, если разработчик приложения не предоставил метод для этого.

1 голос
/ 13 сентября 2010

На основании вашего комментария запущено несколько программ javaw.exe, и вам нужно знать, какую из них убить.

Возможно, вы захотите попробовать подключиться к каждому из процессов с помощью JConsole и проверить JVM. Может быть достаточно подсказок, чтобы определить, кого из них убить. После того как вы определили профиль своего приложения, вы сможете написать логику, чтобы упростить его в будущем (используйте JMX, чтобы получить большую часть информации, предоставляемой JConsole).

0 голосов
/ 12 марта 2012

Просто другой подход: если у вас есть jdk, в папке bin есть программа с именем jvisualVM.Он имеет хорошую информацию о каждом запущенном контексте JVM.Одна из вещей, которые вы можете увидеть, - это PID виртуальной машины, который я использую для завершения процесса в Windows с помощью диспетчера задач (в Windows PID не отображается по умолчанию, но вы можете легко включить столбец, перейдя в представление -> showстолбцы)

0 голосов
/ 13 сентября 2010

Если исполняемый файл запускает javaw, а затем завершает работу, не предоставляя никакой дополнительной информации, кажется, что вам нужно использовать язык сценариев, чтобы сделать снимок запущенных процессов на компьютере перед запуском исполняемого файла и после его завершения.Тогда вы сможете понять, какой новый процесс чаво.Какой язык сценариев вы используете?

...