web-dev-qa-db-fra.com

La bonne façon de tuer un processus en Java

Quel est le meilleur moyen de tuer un processus en Java?

Obtenez le PID puis tuez-le avec Runtime.exec()?

Utilisez destroyForcibly()

Quelle est la différence entre ces deux méthodes et existe-t-il d'autres solutions?

14
Kariamoss

Si le processus que vous souhaitez supprimer a été lancé par votre application

Ensuite, vous avez probablement une référence à celle-ci (ProcessBuilder.start() ou Runtime.exec() renvoient toutes les deux une référence). Dans ce cas, vous pouvez simplement appeler p.destroy(). Je pense que c'est le moyen le plus propre (mais soyez prudent: les sous-processus lancés par p peuvent rester en vie, consultez http://bugs.Sun.com/bugdatabase/view_bug.do?bug_id=4770092 pour plus d'informations) .

La destroyForcibly ne devrait être utilisée que si destroy() a échoué après un certain délai. En un mot

  1. terminer le processus avec destroy() 
  2. permettre au processus de se terminer normalement avec un délai raisonnable 
  3. tuez-le avec destroyForcibly() si le processus est toujours en vie

Si le processus que vous voulez tuer est externe

Alors vous n’avez pas beaucoup de choix: vous devez passer par l’API du système d’exploitation (Runtime.exec). Sous Windows, le programme à appeler sera taskkill.exe, tandis que sous Mac et Linux, vous pouvez essayer kill.


Consultez https://github.com/zeroturnaround/zt-exec/issues/19 et Tuer un processus à l'aide de Java et http://invisiblecomputer.wonderhowto.com/how- to/code-simple-Java-app-kill-tout-processus-après-heure-spécifiée-0133513/ / pour plus d'informations.

16
Derlin

Si vous essayez de supprimer le processus principal démarré par votre code Java, nous vous suggérons d'utiliser System.exit(). Les avantages sont expliqués ici: quand devrions-nous appeler l'exit système en Java .

En règle générale, System.exit() exécutera des crochets d'arrêt permettant de s'assurer que tous les processus dépendants autres que des démons qui n'ont peut-être pas terminé leur travail sont éliminés avant que votre processus ne soit éliminé. C'est la façon propre de le faire.

Si le processus ne vous appartient pas, vous devrez vous fier au système d'exploitation pour effectuer ce travail pour vous, comme expliqué dans cette réponse: Tuer un processus à l'aide de Java

Dans ce cas, votre suggestion de Runtime.exec() un kill sur * nix serait un moyen décent d’aller.

Maintenant, en ce qui concerne destroyForcibly(), vous allez généralement appeler cela sur un processus enfant généré par votre code Java qui a probablement été démarré avec les fonctions ProcessBuilder.start() ou Runtime.exec() de l'api de processus.

6
nlloyd

en code source Java 8

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

merci pour vos conseils, je suis désolé pour mon anglais.
Je veux juste dire que le destroyForcibly est égal au destroy en Java 8
Donc, vous devriez essayer de tuer le processus par pid si le processus est toujours en vie après que vous ayez appelé la méthode destroy
Vous pouvez facilement obtenir un pid si vous utilisez Java 9 +, appelez simplement la méthode Process.pid()

1
钱宇豪

celui qui a fonctionné pour moi est System.exit (0); son travail fonctionne bien car il ferme tous les processus et composants en cours d'exécution

0
Meir Bookatz