Правильный способ убить процесс в Java

каков наилучший способ убить процесс в Java ?

получить PID, а затем убить его с Runtime.exec() ?

использовать destroyForcibly() ?

какая разница между этими двумя методами, и есть ли другие решения ?

4 ответов


если процесс, который вы хотите убить, был запущен вашим приложением

тогда у вас, вероятно, есть ссылка на него (ProcessBuilder.start() или Runtime.exec() Как вернуть ссылку). В этом случае, вы можете просто позвонить p.destroy(). Я думаю, что это самый чистый способ (но будьте осторожны: подпроцессы, запущенные p может остаться в живых, проверьте http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4770092 для получения дополнительной информации).

на destroyForcibly должен быть если используется destroy() сбой после определенного таймаута. В двух словах

  1. завершить процесс с destroy()
  2. разрешить процессу изящно выйти с разумным таймаутом
  3. убить destroyForcibly() если процесс еще жив

если процесс вы хотите убить внешний

тогда у вас нет большого выбора: вам нужно пройти через API ОС (Runtime.exec). В Windows программа для звонок будет taskkill.exe, в то время как на Mac и Linux вы можете попробовать kill.


посмотреть https://github.com/zeroturnaround/zt-exec/issues/19 и убийство процесса с помощью Java и http://invisiblecomputer.wonderhowto.com/how-to/code-simple-java-app-kill-any-process-after-specified-time-0133513/ для получения дополнительной информации.


если вы пытаетесь убить основной процесс, который начал ваш java-код, я бы предложил использовать System.exit(). Преимущества объясняются здесь:когда мы должны вызвать System exit в java.

по сути, System.exit() запускает крючки выключения, которые гарантируют, что все зависимые процессы, не являющиеся демонами, которые, возможно, не завершили свою работу, будут убиты до того, как ваш процесс будет убит. Это чистый способ сделать это.

если процесс не ваш, вам придется полагаться на операционная система, чтобы сделать эту работу для вас, как описано в этом ответе:убийство процесса с помощью Java

в этом случае ваше предложение Runtime.exec() убийство на *nix было бы достойным способом пойти.

теперь что касается destroyForcibly(), вы обычно собираетесь вызвать это на дочернем процессе, порожденном вашим java-кодом, который предположительно был запущен с помощью API процесса ProcessBuilder.start() или Runtime.exec()


тот, который работал для меня система.выход(0); это хорошо, потому что он закрывает все еще работающие процессы и компоненты


в исходном коде java 8

public Process destroyForcibly() {
    destroy();
    return this;
}

спасибо за совет, извините за мой английский.
Я просто хочу сказать, что destroyForcibly равен destroy в Java 8
Таким образом, вы должны попытаться убить процесс pid, если процесс все еще жив после вызова destroy метод
Вы можете легко получить pid, если вы находитесь на java 9+, просто позвоните Process.pid() метод