package test;
import java.lang.reflect.Field;
import jnr.ffi.LibraryLoader;
import jnr.ffi.Pointer;
import jnr.ffi.Runtime;
public class Test {
public static interface Kernel32 {
boolean TerminateProcess(Pointer handle, int exitCode);
}
public static interface Posix {
int kill(int pid, int sig);
}
public static void main(String[] args) throws Exception {
ProcessBuilder pb = new ProcessBuilder(args[0]);
Process p = pb.start();
System.out.println("Sleeping for 5 seconds");
Thread.sleep(5000);
p.destroy();
if (System.getProperty("os.name").toLowerCase().startsWith("win")) {
if (p.getClass().getName().equals("java.lang.Win32Process") ||
p.getClass().getName().equals("java.lang.ProcessImpl")) {
Field f = p.getClass().getDeclaredField("handle");
f.setAccessible(true);
long handle = f.getLong(p);
System.out.println("Killing process");
Pointer ptr = Pointer.wrap(Runtime.getSystemRuntime(), handle);
int exitCode = 0;
Kernel32 kernel32 = LibraryLoader.create(Kernel32.class).load("Kernel32");
kernel32.TerminateProcess(ptr, exitCode);
}
} else {
if (p.getClass().getName().equals("java.lang.UNIXProcess")) {
Field f = p.getClass().getDeclaredField("pid");
f.setAccessible(true);
int pid = f.getInt(p);
System.out.println("Killing process");
Posix posix = LibraryLoader.create(Posix.class).load("c");
posix.kill(pid, 9);
}
}
}
}
Tuesday, January 7, 2014
How to Force Kill a Process in Java
In Java, there is no easy way to force a termination of a process spawned in Java. Calling Process.destroy() does not guarantee that the process will be terminated. Although Java 8 might fix this with Process.destroyForcibly(), if you still use older versions of Java, you are out of luck.
Below is a not-so-portable solution to terminate a process on Linux and Windows using Java Native Runtime. You could also use JNA or JNI to invoke the OS native API.
Subscribe to:
Post Comments (Atom)
No comments:
Post a Comment