Какой лучший способ убить процесс в Java?
Получить PID, а затем убить его с помощью Runtime.exec()
?
Использовать destroyForcibly()
?
Какая разница между этими двумя методами и есть ли какие-либо другие решения?
Какой лучший способ убить процесс в Java?
Получить PID, а затем убить его с помощью Runtime.exec()
?
Использовать destroyForcibly()
?
Какая разница между этими двумя методами и есть ли какие-либо другие решения?
Если процесс, который вы хотите убить, запущен вашим приложением
Тогда у вас, вероятно, есть ссылка на него (ProcessBuilder.start()
или Runtime.exec()
оба возвращают ссылку). В этом случае вы можете просто вызвать p.destroy()
. Я думаю, что это самый чистый способ (но будьте осторожны: подпроцессы, запускаемые p
могут остаться в живых, проверьте http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4770092 для получения дополнительной информации).
destroyForcibly
следует использовать только в том случае, если destroy()
не удалось после определенного времени ожидания. В двух словах
destroy()
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/ для получения дополнительной информации.
Если вы пытаетесь убить основной процесс, ваш Java-код начал, я бы предложил использовать System.exit()
. Преимущества объясняются здесь: когда мы должны называть выход системы в java.
По существу, System.exit()
будет запускать затворы завершения, которые гарантируют, что любые зависимые процессы, не связанные с демонами, которые, возможно, не завершили свою работу, будут убиты до того, как ваш процесс будет убит. Это чистый способ сделать это.
Если процесс не принадлежит вам, вам придется полагаться на операционную систему, чтобы выполнить эту работу для вас, как описано в этом ответе: Убивать процесс с помощью Java
В этом случае ваше предложение Runtime.exec()
kill on * nix было бы достойным способом.
Теперь, как и для destroyForcibly()
, вы обычно называете это дочерним процессом, порожденным вашим Java-кодом, который предположительно начинался с процесса api ProcessBuilder.start()
или Runtime.exec()
В исходном коде Java 8
public Process destroyForcibly() {
destroy();
return this;
}
Я просто хочу сказать, что destroyForcibly
равно destroy
в Java 8.
Поэтому вы должны попытаться уничтожить процесс с помощью pid, если процесс еще жив после того, как вы вызвали метод destroy
. Вы можете легко получить pid, если вы используете java 9+, просто вызовите Process.pid()
.
тот, который работал для меня, - System.exit(0); это работает хорошо, потому что закрывает все работающие процессы и компоненты