it-swarm-eu.dev

Wie finde und beende ich laufende Win-Prozesse in Java?

Ich benötige einen Java-Weg, um einen laufenden Win-Prozess zu finden, von dem ich weiß, wie die ausführbare Datei heißt. Ich möchte sehen, ob es gerade läuft und ich brauche einen Weg, um den Prozess abzubrechen, wenn ich ihn gefunden habe.

22
GHad

Sie können die Befehlszeilen-Windows-Tools tasklist und taskkill verwenden und sie mit Java Runtime.exec() aufrufen.

16
Marcin
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);

 }

BEISPIEL:

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

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

 if (isProcessRunning(processName)) {

  killProcess(processName);
 }
}
38
1-14x0r

Es gibt eine kleine API mit der gewünschten Funktionalität:

https://github.com/kohsuke/winp

Windows-Prozessbibliothek

3
Daniel Lindner

Sie können ein Befehlszeilentool verwenden, um Prozesse wie SysInternals PsKill und SysInternals PsList zu beenden.

Sie können auch die eingebaute Datei tasklist.exe und taskkill.exe verwenden. Diese sind jedoch nur unter Windows XP Professional und höher (nicht in der Home Edition) verfügbar.

Verwenden Sie Java.lang.Runtime.exec , um das Programm auszuführen.

2
arturh

Hier ist eine groovige Art, es zu tun:

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
Craig

Verwenden Sie die folgende Klasse, um einen Windows-Prozess zu beenden ( wenn er ausgeführt wird ). Ich verwende das Force-Befehlszeilenargument /F, um sicherzustellen, dass der durch das /IM-Argument angegebene Prozess beendet wird.

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();
    }
}
1
BullyWiiPlaza

kleine Änderung in der Antwort von Super Kakes

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

Gewechselt zu ..

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

Die /IMF-Option funktioniert nicht. Es beendet den Notizblock nicht. Die /IM-Option funktioniert tatsächlich

0
Harvendra

Sie müssen einen nativen Code aufrufen, da IMHO keine Bibliothek dafür vorhanden ist. Da JNI schwerfällig und hart ist, können Sie versuchen, JNA (Java Native Access) zu verwenden. https://jna.dev.Java.net/

0
jb.