it-swarm.com.ru

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

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

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

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

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

14
Kariamoss

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

Тогда у вас, вероятно, есть ссылка на него (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- для/code-simple-Java-app-kill-any-process-after-указанное-time-0133513/ для получения дополнительной информации.

16
Derlin

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

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

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

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

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

6
nlloyd

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

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

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

1
钱宇豪

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

0
Meir Bookatz