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

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

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

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

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

Ответ 1

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

Тогда у вас, вероятно, есть ссылка на него (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() если процесс еще жив

Если процесс, который вы хотите убить, является внешним

Тогда у вас нет большого выбора: вам нужно пройти через OS 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- убить любой процесс после указанного времени 0133513/ для получения дополнительной информации.

Ответ 2

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

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

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

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

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

Ответ 3

В исходном коде Java 8

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

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

Ответ 4

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