web-dev-qa-db-fra.com

Comment trouver et tuer les processus Win en cours d'exécution à partir de Java?

J'ai besoin d'un moyen Java pour trouver un processus Win en cours d'exécution à partir duquel je sais nommer l'exécutable. Je veux vérifier s'il fonctionne actuellement et j'ai besoin d'un moyen de mettre fin au processus si je le trouvais.

22
GHad

Vous pouvez utiliser les outils de fenêtres de ligne de commande tasklist et taskkill et les appeler à partir de Java à l'aide de Runtime.exec().

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

 }

EXEMPLE:

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

Il existe une petite API fournissant les fonctionnalités souhaitées:

https://github.com/kohsuke/winp

Bibliothèque de processus Windows

3
Daniel Lindner

Vous pouvez utiliser un outil de ligne de commande pour tuer des processus tels que SysInternals PsKill et SysInternals PsList .

Vous pouvez également utiliser tasklist.exe et taskkill.exe intégrés, mais ceux-ci ne sont disponibles que sous Windows XP Professional et versions ultérieures (pas dans l'édition familiale).

Utilisez Java.lang.Runtime.exec pour exécuter le programme.

2
arturh

Voici une façon géniale de le faire:

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

Utilisez la classe suivante pour tuer un processus Windows ( s'il est en cours d'exécution ). J'utilise l'argument de ligne de commande force /F pour m'assurer que le processus spécifié par l'argument /IM sera terminé.

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

petit changement de réponse écrit par Super Kakes

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

Changé en ..

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

L'option /IMF ne fonctionne pas. Elle ne tue pas le bloc-notes..pendant que l'option /IM fonctionne réellement

0
Harvendra

Vous devrez appeler du code natif, car IMHO il n'y a pas de bibliothèque qui le fait. Comme JNI est lourd et difficile, vous pouvez essayer d’utiliser JNA (Java Native Access). https://jna.dev.Java.net/

0
jb.