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

<p>какой лучший способ убить процесс в java?</p><p>получить pid и затем убить его с помощью <code>runtime.exec()</code>?</p><p>использовать <code>destroyforcibly()</code>? </p><p>в чем разница между этими двумя методами, и есть ли другие решения?</p>

<p><strong>если процесс, который вы хотите уничтожить, запущен вашим приложением</strong></p><p>тогда у вас, вероятно, есть ссылка на него (<code>processbuilder.start()</code> или <code>runtime.exec()</code> оба возвращают ссылку). в этом случае вы можете просто вызвать <code>p.destroy()</code>. я думаю, что это самый чистый способ (но будьте осторожны: подпроцессы, запущенные <code>p</code>, могут остаться в живых, проверьте <a href="http://bugs.sun.com/bugdatabase/view\_bug.do?bug\_id=4770092">http://bugs.sun.com/bugdatabase/view\_bug.do?bug\_id=4770092</a> для получения дополнительной информации) ,.</p><p><code>destroyforcibly</code> следует использовать только в случае сбоя <code>destroy()</code> после определенного времени ожидания. в двух словах</p><ol> <li>завершить процесс с помощью <code>destroy()</code> </li> <li>разрешить процессу корректно завершить работу с разумным временем ожидания </li> <li>убить его с помощью <code>destroyforcibly()</code>, если процесс еще жив</li> </ol><hr><p><strong>если процесс, который вы хотите уничтожить, является внешним</strong></p><p>тогда у вас нет большого выбора: вам нужно пройти через os api (<code>runtime.exec</code>). в windows вызываемой программой будет <code>taskkill.exe</code>, а в mac и linux вы можете попробовать <code>kill</code>.</p><hr><p>посмотрите на <a href="https://github.com/zeroturnaround/zt-exec/issues/19">https://github.com/zeroturnaround/zt-exec/issues/19</a> и <a href="https://stackoverflow.com/questions/6356340/killing-a-process-using-java">уничтожение процесса с помощью java</a> и <a href="http://invisiblecomputer.wonderhowto.com/how-to/code-simple-java-app-kill-any-process-after-specified-time-0133513/">http://invisiblecomputer.wonderhowto.com/how- для/code-simple-java-app-kill-any-process-after-указанное-time-0133513/</a> для получения дополнительной информации.</p>

<p>если вы пытаетесь завершить основной процесс, в котором запущен ваш java-код, я бы предложил использовать <code>system.exit()</code>. преимущества объясняются здесь: <a href="https://stackoverflow.com/questions/3715967/when-should-we-call-system-exit-in-java">когда мы должны вызывать системный выход в java</a> .</p><p>по сути, <code>system.exit()</code> будет запускать перехватчики завершения работы, которые будут гарантировать, что все зависимые процессы, не являющиеся демонами, которые, возможно, не завершили свою работу, будут уничтожены до того, как будет уничтожен ваш процесс. это чистый способ сделать это.</p><p>если процесс не ваш, вам придется полагаться на операционную систему, чтобы выполнить эту работу за вас, как объяснено в этом ответе: <a href="https://stackoverflow.com/questions/6356340/killing-a-process-using-java">уничтожение процесса с помощью java</a> </p><p>в этом случае ваше предложение <code>runtime.exec()</code> a kill on * nix было бы неплохим вариантом.</p><p>теперь, что касается <code>destroyforcibly()</code>, вы обычно будете вызывать его в дочернем процессе, порожденном вашим java-кодом, который предположительно был запущен с помощью api-интерфейса процесса <code>processbuilder.start()</code> или <code>runtime.exec()</code></p>

<p>в исходном коде java 8</p><pre><code>public process destroyforcibly() { destroy(); return this; } </code></pre><p>спасибо за ваш совет, извините за мой английский.<br> я просто хочу сказать, что destroyforcbly равнозначен разрушению в java 8<br> поэтому вы должны попытаться убить процесс с помощью pid, если процесс еще жив после того, как вы вызвали метод <code>destroy</code><br> вы можете легко получить pid, если используете java 9+, просто вызовите метод <code>process.pid()</code></p>

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