В Linux, когда я запускаю функцию destroy в объекте java.lang.Process(который является истинным типизированным java.lang.UNIXProcess), он отправляет сигнал SIGTERM для обработки, есть ли способ убить его с помощью SIGKILL?
Как я могу убить Linux-процесс в Java с помощью SIGKILL Process.destroy() делает SIGTERM
Ответ 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();