73 votes

Tuer un processus à l'aide de Java

Je voudrais savoir comment "tuer" un processus qui a commencé. Je suis au courant de l'API processus, mais je ne suis pas sûr, Si je peux l'utiliser pour "tuer" un processus déjà en cours d'exécution, tels que firefox.exe etc. Si l'API Process peut être utilisée, pouvez-vous s'il vous plaît me diriger dans la bonne direction? Si ce n'est pas le cas, quelles sont les autres options disponibles? merci.

61voto

Dans Windows, vous devez probablement utiliser cette commande

pour le tuer avec force. Donc, il sera

60voto

Yohan Liyanage Points 2283

Si vous démarrez le processus de partir avec dans votre application Java (ex. en appelant Runtime.exec() ou ProcessBuilder.start()), alors vous avez un valide Process référence, et vous pouvez l'invoquer l' destroy() méthode de Process classe de tuer un processus particulier.

Mais sachez que si le processus que vous invoquez crée de nouveaux sous-processus, ceux qui peuvent ne pas être interrompu (voir http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4770092).

D'autre part, si vous voulez tuer des processus externes (que vous n'avez pas se reproduire à partir de votre application Java), puis une chose que vous pouvez faire est d'appeler O/S utilitaires qui vous permettent de le faire. Par exemple, vous pouvez essayer un Runtime.exec() sur kill de commande sous Unix / Linux et vérifier les valeurs de retour pour s'assurer que la demande a été tué ou non (0 signifie le succès, -1 signifie d'erreur). Mais qui sera bien sûr de faire votre demande dépendants de la plateforme.

32voto

chro Points 697

AFAIU java.lang.Process est le processus créé par java lui-même (comme Runtime.exec('firefox'))

Vous pouvez utiliser des commandes dépendantes du système comme

4voto

chukko Points 21

Accidentellement, je suis tombé sur une autre façon de faire une force tuer sur Unix (pour ceux qui utilisent Weblogic). C'est moins cher et plus élégant que courir /bin/kill -9 via Runtime.exec().

Et si vous luttez pour obtenir le pid, vous pouvez utiliser la réflexion sur java.lang.UNIXProcess, par exemple:

3voto

chukko Points 21

Il pourrait être un interprète de java défaut, mais java sur HPUX ne pas faire un kill -9, mais seulement un kill-TERM.

J'ai fait un petit test testDestroy.java:

ProcessBuilder pb = new ProcessBuilder(args);
Process process = pb.start();
Thread.sleep(1000);
process.destroy();
process.waitFor();

Et l'invocation:

$ tusc -f -p -s signal,kill -e /opt/java1.5/bin/java testDestroy sh -c 'trap "echo TERM" TERM; sleep 10'

meurt au bout de 10s (pas tué après 1s) et montre:

...
[19999]   Received signal 15, SIGTERM, in waitpid(), [caught], no siginfo
[19998] kill(19999, SIGTERM) ............................................................................. = 0
...

Faire de même sur windows semble tuer le processus d'amende, même si le signal est traité (mais qui pourrait être dû à windows à l'aide des signaux de détruire).

En fait j'ai trouvé Java - Processus.destroy() le code source pour Linux sujet et openjava la mise en œuvre semble utiliser à long TERME ainsi, ce qui semble très mal.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X