java linux process kill sigterm

¿Cómo puedo matar un proceso de Linux en java con SIGKILL Process.destroy() hace SIGTERM?



(4)

Desde Java 1.8

puede llamar al método destroyForcibly() , que llama al método destroy() de manera predeterminada, pero de acuerdo con los documentos de Java, todos los subprocesos devueltos por ProcessBuilder o Runtime.exec() implementan este método.

En Linux, cuando ejecuto la función de destrucción en el objeto java.lang.Process (que es el tipo de java.lang.UNIX procesado), envía una señal SIGTERM para procesarla. ¿Hay alguna forma de matarla con SIGKILL?


No usar Java puro.

Su alternativa más simple es usar Runtime.exec() para ejecutar un comando kill -9 <pid> como un proceso externo.

Desafortunadamente, no es tan sencillo conseguir el PID. Tendrá que usar la magia negra de reflexión para acceder al campo private int pid , o jugar con la salida del comando ps .

ACTUALIZACIÓN - en realidad, hay otra manera. Cree una pequeña utilidad (programa C, shell script, lo que sea) que ejecutará la aplicación externa real. Codifique la utilidad para que recuerde el PID del proceso hijo y configure un controlador de señal para SIGTERM que SIGKILL el proceso hijo.


Si conoces el nombre del proceso puedes usar pkill

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


Stephen su respuesta es correcta. Escribí lo que dijo:

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(); }

También puede obtener el pid de esta manera:

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