Как найти и уничтожить запущенные Win-процессы из Java? - PullRequest
23 голосов
/ 17 сентября 2008

Мне нужен способ Java, чтобы найти работающий процесс Win, из которого я знаю имя исполняемого файла. Я хочу посмотреть, работает ли он прямо сейчас, и мне нужен способ убить процесс, если я его нашел.

Ответы [ 8 ]

39 голосов
/ 19 сентября 2011
private static final String TASKLIST = "tasklist";
private static final String KILL = "taskkill /F /IM ";

public static boolean isProcessRunning(String serviceName) throws Exception {

 Process p = Runtime.getRuntime().exec(TASKLIST);
 BufferedReader reader = new BufferedReader(new InputStreamReader(
   p.getInputStream()));
 String line;
 while ((line = reader.readLine()) != null) {

  System.out.println(line);
  if (line.contains(serviceName)) {
   return true;
  }
 }

 return false;

}

public static void killProcess(String serviceName) throws Exception {

  Runtime.getRuntime().exec(KILL + serviceName);

 }

Пример:

public static void main(String args[]) throws Exception {
 String processName = "WINWORD.EXE";

 //System.out.print(isProcessRunning(processName));

 if (isProcessRunning(processName)) {

  killProcess(processName);
 }
}
15 голосов
/ 17 сентября 2008

Вы можете использовать инструменты командной строки Windows tasklist и taskkill и вызывать их из Java, используя Runtime.exec().

3 голосов
/ 19 апреля 2010

Есть небольшой API, обеспечивающий желаемую функциональность:

https://github.com/kohsuke/winp

Библиотека процессов Windows

2 голосов
/ 02 апреля 2015

Вот отличный способ сделать это:

final Process jpsProcess = "cmd /c jps".execute()
final BufferedReader reader = new BufferedReader(new InputStreamReader(jpsProcess.getInputStream()));
def jarFileName = "FileName.jar"
def processId = null
reader.eachLine {
    if (it.contains(jarFileName)) {
        def args = it.split(" ")
        if (processId != null) {
            throw new IllegalStateException("Multiple processes found executing ${jarFileName} ids: ${processId} and ${args[0]}")
        } else {
            processId = args[0]
        }
    }
}
if (processId != null) {
    def killCommand = "cmd /c TASKKILL /F /PID ${processId}"
    def killProcess = killCommand.execute()
    def stdout = new StringBuilder()
    def stderr = new StringBuilder()
    killProcess.consumeProcessOutput(stdout, stderr)
    println(killCommand)
    def errorOutput = stderr.toString()
    if (!errorOutput.empty) {
        println(errorOutput)
    }
    def stdOutput = stdout.toString()
    if (!stdOutput.empty) {
        println(stdOutput)
    }
    killProcess.waitFor()
} else {
    System.err.println("Could not find process for jar ${jarFileName}")
}
2 голосов
/ 17 сентября 2008

Вы можете использовать инструмент командной строки для уничтожения процессов, таких как SysInternals PsKill и SysInternals PsList .

Вы также можете использовать встроенные tasklist.exe и taskkill.exe, но они доступны только в Windows XP Professional и более поздних версиях (не в Home Edition).

Используйте java.lang.Runtime.exec для запуска программы.

1 голос
/ 15 июня 2015

Используйте следующий класс для уничтожения процесса Windows (, если он выполняется ). Я использую аргумент командной строки force /F, чтобы убедиться, что процесс, указанный в аргументе /IM, будет завершен.

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class WindowsProcess
{
    private String processName;

    public WindowsProcess(String processName)
    {
        this.processName = processName;
    }

    public void kill() throws Exception
    {
        if (isRunning())
        {
            getRuntime().exec("taskkill /F /IM " + processName);
        }
    }

    private boolean isRunning() throws Exception
    {
        Process listTasksProcess = getRuntime().exec("tasklist");
        BufferedReader tasksListReader = new BufferedReader(
                new InputStreamReader(listTasksProcess.getInputStream()));

        String tasksLine;

        while ((tasksLine = tasksListReader.readLine()) != null)
        {
            if (tasksLine.contains(processName))
            {
                return true;
            }
        }

        return false;
    }

    private Runtime getRuntime()
    {
        return Runtime.getRuntime();
    }
}
0 голосов
/ 26 мая 2015

небольшое изменение в ответе Super Kakes

private static final String KILL = "taskkill /IMF ";

Изменено на ..

private static final String KILL = "taskkill /IM ";
Параметр

/IMF не работает. Он не убивает блокнот .. в то время как параметр /IM действительно работает

0 голосов
/ 17 сентября 2008

Вам придется вызывать некоторый нативный код, так как ИМХО нет библиотеки, которая делает это. Поскольку JNI громоздок и сложен, вы можете попробовать использовать JNA (Java Native Access). https://jna.dev.java.net/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...