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?
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
destroy()
destroyForcibly()
si le processus est toujours en vieSi 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.
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.
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()
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