Как я могу убить процесс Linux в Java с SIGKILL Process.destroy () делает SIGTERM - PullRequest
16 голосов
/ 01 июня 2010

В Linux, когда я запускаю функцию уничтожения для объекта java.lang.Process (который является истинно типизированным java.lang.UNIXProcess), он отправляет сигнал SIGTERM для обработки, есть ли способ убить его с помощью SIGKILL?

Ответы [ 4 ]

15 голосов
/ 01 июня 2010

Не используется чистая Java.

Самая простая альтернатива - использовать Runtime.exec() для запуска команды kill -9 <pid> как внешнего процесса.

К сожалению, получить PID не так просто. Вам нужно будет либо использовать чёрную магию отражения для доступа к полю private int pid, либо возиться с выводом команды ps.

ОБНОВЛЕНИЕ - на самом деле, есть другой способ. Создайте небольшую утилиту (программу на C, скрипт оболочки, что угодно), которая будет запускать настоящее внешнее приложение. Кодируйте утилиту так, чтобы она запоминала PID дочернего процесса и настраивала обработчик сигнала для SIGTERM, который будет SIGKILL дочернего процесса.

11 голосов
/ 01 июня 2010

Стивен, его ответ правильный. Я написал то, что он сказал:

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

Вы также можете получить pid следующим образом:

public static int getPID() {
  String tmp = java.lang.management.ManagementFactory.getRuntimeMXBean().getName();
  tmp = tmp.split("@")[0];
  return Integer.valueOf(tmp);
}
1 голос
/ 22 июля 2015

С Java 1.8

Вы можете вызвать метод destroyForcibly(), который по умолчанию вызывает метод destroy(), но согласно документации Java все подпроцессы, возвращаемые ProcessBuilder или Runtime.exec(), реализуют этот метод.

1 голос
/ 15 мая 2015

Если вы знаете имя процесса, вы можете использовать pkill

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