Comment puis-je tuer un processus Linux en Java avec SIGKILL Process.destroy () fait SIGTERM

Sous Linux, lorsque je lance la fonction destroy sur un object java.lang.Process (ce qui est vrai sous java.lang.UNIXProcess), il envoie un signal SIGTERM à traiter, y a-t-il un moyen de le tuer avec SIGKILL?

Ne pas utiliser Java pur.

Votre alternative la plus simple consiste à utiliser Runtime.exec() pour exécuter une commande kill -9 tant que processus externe.

Malheureusement, il n’est pas si simple de se procurer le PID. Vous devrez soit utiliser la reflection black-magic pour accéder au champ private int pid , soit vous amuser avec la sortie de la commande ps .

MISE À JOUR – en fait, il y a une autre manière. Créez un petit utilitaire (programme C, script shell, peu importe) qui exécutera l’application externe réelle. Codez l’utilitaire pour qu’il se souvienne du PID du processus enfant et configure un gestionnaire de signal pour SIGTERM qui SIGKILL le processus enfant.

Stephen sa réponse est correcte. J’ai écrit ce qu’il a dit:

 public static int getUnixPID(Process process) throws Exception { System.out.println(process.getClass().getName()); if (process.getClass().getName().equals("java.lang.UNIXProcess")) { Class cl = process.getClass(); Field field = cl.getDeclaredField("pid"); field.setAccessible(true); Object pidObject = field.get(process); return (Integer) pidObject; } else { throw new IllegalArgumentException("Needs to be a UNIXProcess"); } } public static int killUnixProcess(Process process) throws Exception { int pid = getUnixPID(process); return Runtime.getRuntime().exec("kill " + pid).waitFor(); } 

Vous pouvez également obtenir le pid de cette façon:

 public static int getPID() { Ssortingng tmp = java.lang.management.ManagementFactory.getRuntimeMXBean().getName(); tmp = tmp.split("@")[0]; return Integer.valueOf(tmp); } 

Si vous connaissez le nom du processus, vous pouvez utiliser pkill

 Runtime.getRuntime().exec("pkill firefox").waitFor(); 

Depuis Java 1.8

vous pouvez appeler la méthode destroyForcibly() , qui appelle la méthode destroy() par défaut, mais selon les documents Java, tous les sous-processus renvoyés par ProcessBuilder ou Runtime.exec() implémentent cette méthode.