ekeren
ekeren

Reputation: 3458

how can I kill a Linux process in java with SIGKILL Process.destroy() does SIGTERM

In Linux when I run the destroy function on java.lang.Process object (Which is true typed java.lang.UNIXProcess ) it sends a SIGTERM signal to process, is there a way to kill it with SIGKILL?

Upvotes: 18

Views: 20426

Answers (4)

Ercksen
Ercksen

Reputation: 669

Since Java 1.8

you can call the method destroyForcibly(), which calls the destroy() method by default, but according to the Java docs, all sub-processes returned by ProcessBuilder or Runtime.exec() implement this method.

Upvotes: 1

utarid
utarid

Reputation: 1715

If you know process name you can use pkill

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

Upvotes: 1

Martijn Courteaux
Martijn Courteaux

Reputation: 68847

Stephen his answer is correct. I wrote what he said:

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

You can also get the pid this way:

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

Upvotes: 11

Stephen C
Stephen C

Reputation: 718758

Not using pure Java.

Your simplest alternative is to use Runtime.exec() to run a kill -9 <pid> command as an external process.

Unfortunately, it is not that simple to get hold of the PID. You will either need to use reflection black-magic to access the private int pid field, or mess around with the output from the ps command.

UPDATE - actually, there is another way. Create a little utility (C program, shell script, whatever) that will run the real external application. Code the utility so that it remembers the PID of the child process, and sets up a signal handler for SIGTERM that will SIGKILL the child process.

Upvotes: 15

Related Questions