В Linux, когда я запускаю функцию уничтожения объекта java.lang.Process (который является типизированным java.lang.UNIXProcess ), он отправляет сигнал SIGTERM в процесс, есть ли способ убить его с помощью SIGKILL?
как я могу убить процесс Linux в java с помощью SIGKILL Process.destroy() делает SIGTERM
Ответы (4)
Не используя чистую Java.
Самый простой вариант — использовать Runtime.exec()
для запуска команды kill -9 <pid>
в качестве внешнего процесса.
К сожалению, получить PID не так просто. Вам нужно будет либо использовать черную магию отражения для доступа к полю private int pid
, либо возиться с выводом команды ps
.
ОБНОВЛЕНИЕ - на самом деле есть другой способ. Создайте небольшую утилиту (программу на C, сценарий оболочки и т. д.), которая будет запускать реальное внешнее приложение. Закодируйте утилиту так, чтобы она запоминала PID дочернего процесса и устанавливала обработчик сигнала для SIGTERM, который будет SIGKILL дочернего процесса.
Process.toString()
выдает строку Process[pid=1234]
- person Alexander Malakhov; 13.02.2014
toString()
не указан формат строки. Согласно исходному коду, для Oracle Java в Unix метод toString()
для Process
и UnixProcess
не переопределяется из Object.toString()
. То, что вы видите, (в лучшем случае) специфично для Android.
- person Stephen C; 13.02.2014
5.21
вы можете смотрим как определяется сигнал: int sig = (force == JNI_TRUE) ? SIGKILL : SIGTERM;
. Итак, как видите, SIGTERM является сигналом по умолчанию, а SIGKILL используется при форсировании. Обратите внимание, что это только для класса UNIXProcess
, но я считаю, что другие системы не будут вести себя по-другому.
- person Ercksen; 09.08.2015
kill -9
, но не для kill -2
? Я обнаружил, что kill -2
не работает при вызове из java, но работает из оболочки. Подробности: stackoverflow.com/q/49522487/1054322
- person MatrixManAtYrService; 28.03.2018
kill -2
из Java, этого не делает. И закомментированный код не скомпилируется, потому что в Process
нет атрибута pid.
- person Stephen C; 28.03.2018
Стивен, его ответ правильный. Я написал то, что он сказал:
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);
}
getName
говорится: Возвращенная строка имени может быть любой произвольной строкой, и реализация виртуальной машины Java может встроить в возвращаемую строку имени полезную информацию, зависящую от платформы. Примечание: может< /b> выбрать, означает, что он также может не делать этого. И нет спецификации того, как эта информация должна быть отформатирована.
- person Stephen C; 13.02.2014
process.pid()
, чтобы получить идентификатор процесса.
- person Luke Hutchison; 02.12.2020
Если вы знаете имя процесса, вы можете использовать pkill
Runtime.getRuntime().exec("pkill firefox").waitFor();
Начиная с Java 1.8
вы можете вызвать метод destroyForcibly()
, который по умолчанию вызывает метод destroy()
, но, согласно документам Java, все подпроцессы, возвращаемые ProcessBuilder
или Runtime.exec()
, реализуют этот метод.
destroy()
. См. здесь: bugs.openjdk.java.net/browse/JDK-8056139
- person Joe; 26.01.2016