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.
Réponses
Trop de publicités?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.
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:
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.