2016-02-05 32 views
9

Qual è il modo migliore per uccidere un processo in Java?Il modo giusto per uccidere un processo in Java

Ottenere il PID e quindi ucciderlo con Runtime.exec()?

Utilizzare destroyForcibly()?

Qual è la differenza tra questi due metodi e ci sono altre soluzioni?

+1

È questo il tuo proprio processo del api processo o un altro processo? –

+0

è un processo java o qualsiasi processo? – Derlin

+0

Era per un processo esterno non Java, ma grazie per il modo in cui entrambi Shitsu – Kariamoss

risposta

9

Se il processo si vuole uccidere è stata avviata dalla vostra applicazione

allora probabilmente avete un riferimento ad esso (ProcessBuilder.start() o Runtime.exec() sia restituire un riferimento). In questo caso, puoi semplicemente chiamare p.destroy(). Penso che questo sia il modo più pulito (ma attenzione: i sottoprocessi avviati da p potrebbero rimanere in vita, controllare http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4770092 per maggiori informazioni).

Il destroyForcibly deve essere utilizzato solo se destroy() non riesce dopo un determinato timeout. In poche parole

  1. processo terminerà con destroy()
  2. permettono processo per uscire con garbo con timeout ragionevole
  3. ucciderlo con destroyForcibly() se il processo è ancora vivo

Se il processo vuoi uccidere è esterno

Quindi non si ha molta scelta: è necessario passare attraverso l'API del sistema operativo (Runtime.exec). Su Windows, il programma da chiamare sarà taskkill.exe, mentre su Mac e Linux è possibile provare kill.


Dai un'occhiata alla https://github.com/zeroturnaround/zt-exec/issues/19 e Killing a process using Java e http://invisiblecomputer.wonderhowto.com/how-to/code-simple-java-app-kill-any-process-after-specified-time-0133513/ per maggiori informazioni.

+0

Grazie mille per le spiegazioni! Questo è sicuramente quello che stavo cercando – Kariamoss

4

Se si sta tentando di interrompere il processo principale, è stato avviato il codice java, suggerirei di utilizzare System.exit(). I vantaggi sono spiegati qui: when should we call system exit in java.

In sostanza, System.exit() eseguirà hook di arresto che assicureranno che tutti i processi non demone dipendenti che potrebbero non aver completato il loro lavoro vengano uccisi prima che il processo venga interrotto. Questo è il modo pulito per farlo.

Se il processo non la tua è, si dovrà fare affidamento sul sistema operativo per fare questo lavoro per voi, come spiegato in questa risposta: Killing a Process Using Java

In questo caso il vostro suggerimento di Runtime.exec() un'uccisione su * nix sarebbe essere un modo decente per andare

Ora, come per destroyForcibly(), il gioco è in genere intenzione di chiamare che in un processo figlio generato dal codice Java che è stato presumibilmente iniziato con ProcessBuilder.start() o Runtime.exec()