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

Убивание процесса с использованием Java

Я хотел бы знать, как "убить" процесс, который запущен. Я знаю API процесса, но я не уверен, если я могу использовать это, чтобы "убить" уже запущенный процесс, например firefox.exe и т.д. Если API процесса можно использовать, можете ли вы указать мне на правильное направление? Если нет, то каковы другие доступные варианты? Спасибо.

4b9b3361

Ответ 1

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

Но имейте в виду, что если вызываемый вами процесс создает новые подпроцессы, они не могут быть прерваны (см. http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4770092).

С другой стороны, если вы хотите убить внешние процессы (которые вы не создавали из своего Java-приложения), то одна вещь, которую вы можете сделать, - вызвать утилиты O/S, которые позволяют вам это сделать. Например, вы можете попробовать команду Runtime.exec() on kill в Unix/Linux и проверить значения возврата, чтобы гарантировать, что приложение было убито или нет (0 означает успех, -1 означает ошибку). Но это, конечно же, сделает вашу платформу приложений зависимой.

Ответ 2

В Windows вам, вероятно, придется использовать эту команду

taskkill /F /IM <processname>.exe 

чтобы убить его силой. Так будет

Runtime.getRuntime().exec("taskkill /F /IM <processname>.exe")

Ответ 3

AFAIU java.lang.Process - это процесс, созданный самой java (например, Runtime.exec('firefox'))

Вы можете использовать зависящие от системы команды, например

 Runtime rt = Runtime.getRuntime();
  if (System.getProperty("os.name").toLowerCase().indexOf("windows") > -1) 
     rt.exec("taskkill " +....);
   else
     rt.exec("kill -9 " +....);

Ответ 4

Случайно я наткнулся на другой способ сделать силовое убийство в Unix (для тех, кто использует Weblogic). Это дешевле и элегантнее, чем запуск /bin/kill -9 через Runtime.exec().

import weblogic.nodemanager.util.Platform;
import weblogic.nodemanager.util.ProcessControl;
...
ProcessControl pctl = Platform.getProcessControl();
pctl.killProcess(pid);

И если вы пытаетесь получить pid, вы можете использовать отражение на java.lang.UNIXProcess, например:

Process proc = Runtime.getRuntime().exec(cmdarray, envp);
if (proc instanceof UNIXProcess) {
    Field f = proc.getClass().getDeclaredField("pid");
    f.setAccessible(true);
    int pid = f.get(proc);
}

Ответ 5

Это может быть дефект интерпретатора java, но java на HPUX не убивает -9, а только убивает -TERM.

Я сделал небольшой тест testDestroy.java:

ProcessBuilder pb = new ProcessBuilder(args);
Process process = pb.start();
Thread.sleep(1000);
process.destroy();
process.waitFor();

И вызов:

$ tusc -f -p -s signal,kill -e /opt/java1.5/bin/java testDestroy sh -c 'trap "echo TERM" TERM; sleep 10'

умирает через 10 секунд (не убивается после 1 с, как ожидалось) и показывает:

...
[19999]   Received signal 15, SIGTERM, in waitpid(), [caught], no siginfo
[19998] kill(19999, SIGTERM) ............................................................................. = 0
...

Выполнение такого же действия в окнах, похоже, убивает процесс, даже если сигнал обрабатывается (но это может быть связано с тем, что окна не используют сигналы для уничтожения).

На самом деле я нашел Java-Process.destroy() исходный код для Linux, связанный поток и реализация openjava, похоже, тоже используют -TERM, что кажется очень неправильным.

Ответ 6

Попробуйте:

    String command = "killall <your_proccess>";
    Process p = Runtime.getRuntime().exec(command);
    p.destroy();

если процесс все еще жив, добавьте:

    p.destroyForcibly();

Ответ 7

Вы можете убить (SIGTERM) процесс Windows, который был запущен с Java, вызвав метод destroy на объекте Process. Вы также можете убить любые дочерние процессы (начиная с Java 9).

Следующий код запускает командный файл, ждет десять секунд, а затем убивает все подпроцессы и, наконец, убивает сам пакетный процесс.

ProcessBuilder pb = new ProcessBuilder("cmd /c my_script.bat"));
Process p = pb.start();
p.waitFor(10, TimeUnit.SECONDS);

p.descendants().forEach(ph -> {
    ph.destroy();
});

p.destroy();