关于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/


推荐阅读

    linux截取进程命令?

    linux截取进程命令?,系统,工作,状态,信息,进程,软件,地址,命令,标准,实时,lin

    linux退出进程命令?

    linux退出进程命令?,系统,软件,名称,代码,进程,报告,数字,暂停,状态,平台,lin

    linux下进程调试命令?

    linux下进程调试命令?,系统,工作,软件,信息,命令,基础,地址,状态,进程,实时,L

    linux切换进程命令?

    linux切换进程命令?,服务,系统,工具,地址,命令,基础,工作,标准,情况,状态,Lin

    递归查找linux命令?

    递归查找linux命令?,时间,档案,命令,标准,数据,系统,名称,文件,服务,信息,lin

    linux查询命令进程?

    linux查询命令进程?,系统,名称,总量,情况,状态,进程,材料,工具,电脑,数据,怎

    linux命令如何杀进程?

    linux命令如何杀进程?,状态,系统,暂停,管理,进程,命令,平台,信息,工具,电脑,L

    linux常用命令查进程?

    linux常用命令查进程?,系统,情况,软件,工具,实时,代码,电脑,地址,总量,状态,

    linux查找设备号命令?

    linux查找设备号命令?,设备,系统,信息,名称,分区,网上,情况,软件,技术,工具,

    linux命令进程状态?

    linux命令进程状态?,系统,状态,进程,命令,数据,管理,软件,名称,信息,参数,Lin

    linux查进程命令软件?

    linux查进程命令软件?,系统,软件,状态,进程,信息,命令,名称,数据,基础,表示,l

    linux中进程的命令?

    linux中进程的命令?,系统,进程,管理,状态,情况,信息,命令,平台,数据,实时,lin

    linux命令搜索进程?

    linux命令搜索进程?,系统,状态,软件,情况,进程,命令,代码,信息,数据,实时,如

    linux查找网卡的命令?

    linux查找网卡的命令?,地址,系统,网络,实时,工具,信息,技术指标,电脑,状态,

    linux查看命令行进程?

    linux查看命令行进程?,系统,软件,信息,状态,进程,名称,实时,命令,数据,电脑,

    linux杀死程序命令?

    linux杀死程序命令?,信息,系统,名称,进程,管理,命令,工具,状态,电脑,材料,lin

    监视进程命令linux?

    监视进程命令linux?,系统,状态,工作,地址,信息,进程,软件,命令,数据,实时,如

    linux结束进程命令?

    linux结束进程命令?,系统,软件,管理,进程,名称,数据,单位,状态,数字,代码,Lin

    字符串查找命令linux?

    字符串查找命令linux?,系统,字符串,工具,信息,文件,命令,字符,选项,文本,范

    linux杀进程命令图片?

    linux杀进程命令图片?,系统,工具,图片,进程,管理,名称,传播,工作,命令,后台,L