2016-02-05 32 views
9

Jaki jest najlepszy sposób na zabicie procesu w Javie?Właściwy sposób na zabicie procesu w Javie

Uzyskaj PID, a następnie zabij go przy pomocy Runtime.exec()?

Użyj destroyForcibly()?

Jaka jest różnica między tymi dwoma metodami i czy istnieją inne rozwiązania?

+1

czy to własnego procesu lub innego procesu? –

+0

jest to proces java lub dowolny proces? – Derlin

+0

To było dla zewnętrznego procesu nie Java, ale dzięki za obie Shitsu – Kariamoss

Odpowiedz

9

Jeśli proces chcesz zabić został rozpoczęty przez aplikację

to prawdopodobnie masz odniesienie do niego (lub Runtime.exec()ProcessBuilder.start() zwracają referencję). W takim przypadku możesz po prostu zadzwonić pod numer p.destroy(). Myślę, że jest to najczystszy sposób (ale bądź ostrożny: podprocesy rozpoczęte przez p mogą pozostać przy życiu, sprawdź http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4770092, aby uzyskać więcej informacji).

Urządzenie destroyForcibly powinno być używane tylko wtedy, gdy destroy() zakończyło się niepowodzeniem po określonym czasie oczekiwania. W skrócie

  1. proces zakończyć z destroy()
  2. umożliwić proces bezpiecznie wyjść z rozsądnego limitu czasu
  3. zabić go destroyForcibly() jeśli proces jest wciąż żyje

Jeśli proces chcesz zabić jest zewnętrzny

Wtedy nie masz dużego wyboru: musisz przejść przez interfejs API systemu operacyjnego (Runtime.exec). W systemie Windows program do wywołania będzie taskkill.exe, podczas gdy na Mac i Linux możesz wypróbować kill.


Wystarczy popatrzeć na https://github.com/zeroturnaround/zt-exec/issues/19 i Killing a process using Java i http://invisiblecomputer.wonderhowto.com/how-to/code-simple-java-app-kill-any-process-after-specified-time-0133513/ uzyskać więcej informacji.

+0

Wielkie dzięki za wyjaśnienia! Tego właśnie szukałem – Kariamoss

4

Jeśli próbujesz zabić główny proces, w którym rozpoczął się twój kod Java, proponuję użyć System.exit(). Korzyści są wyjaśnione tutaj: when should we call system exit in java.

Zasadniczo będzie uruchamiał haczyki zamknięcia, które sprawią, że wszelkie zależne procesy niebędące demonami, które mogły nie zakończyć swojej pracy, zostaną zabite, zanim proces zostanie zabity. To jest czysty sposób na zrobienie tego.

Jeśli proces nie twoje jest, trzeba będzie polegać na system operacyjny do wykonania tej pracy dla Ciebie jak wyjaśniono w tej odpowiedzi: Killing a Process Using Java

W tym przypadku swoją sugestię Runtime.exec() zabić na * nix będzie być przyzwoitą drogą.

Teraz jak destroyForcibly(), jesteś zazwyczaj zamiar zadzwonić, że na procesie potomnym wywoływanych przez kod Java, który był przypuszczalnie rozpocząć proces API ProcessBuilder.start() lub Runtime.exec()

Powiązane problemy