关于Windows:如何在Java中查找并杀死正在运行的Win-Processes?

关于Windows:如何在Java中查找并杀死正在运行的Win-Processes?

How to find and kill running Win-Processes from within Java?

我需要一种Java方式来查找正在运行的Win进程,从该进程我知道可执行文件的名称。 我想看看它现在是否正在运行,如果找到了,我需要一种方法来终止该进程。


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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);

 }

例:

1
2
3
4
5
6
7
8
9
10
public static void main(String args[]) throws Exception {
 String processName ="WINWORD.EXE";

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

 if (isProcessRunning(processName)) {

  killProcess(processName);
 }
}

您可以使用命令行窗口工具tasklisttaskkill,并使用Runtime.exec()从Java调用它们。


这是一种常规的方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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}")
}


有一些API提供所需的功能:

https://github.com/kohsuke/winp

Windows进程库


您可以使用命令行工具杀死SysInternals PsKill和SysInternals PsList之类的进程。

您也可以使用内置的tasklist.exe和taskkill.exe,但是它们仅在Windows XP Professional和更高版本(而不是家庭版)中可用。

使用java.lang.Runtime.exec执行程序。


使用以下类杀死Windows进程(如果正在运行)。我正在使用force命令行参数/F确保由/IM参数指定的进程将终止。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
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();
    }
}

Super kakes撰写的答案的微小变化

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

变成 ..

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

/IMF选项不起作用。它不会杀死记事本..而/IM选项实际上起作用


您将不得不调用一些本机代码,因为恕我直言,没有库可以做到这一点。由于JNI繁琐且困难,因此您可以尝试使用JNA(Java本机访问)。 https://jna.dev.java.net/


推荐阅读