Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

UPDATE - на самом деле, есть и другой способ. Создайте небольшую утилиту (программа C, оболочка script, что угодно), которая будет запускать реальное внешнее приложение. Код утилиты, чтобы он помнил PID дочернего процесса, и устанавливает обработчик сигнала для SIGTERM, который будет SIGKILL дочернего процесса.

Ответ 2

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

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

Ответ 3

Так как Java 1.8

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

Ответ 4

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

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