如何从Java内部find并杀死正在运行的Win-Processes?

我需要一个Java方法来查找正在运行的Win进程,从中我知道可执行文件的名称。 我想看看它是否现在正在运行,如果我发现它,我需要一个杀死进程的方法。

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

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

有一些API提供了所需的function:

https://github.com/kohsuke/winp

Windows过程库

你可以使用命令行工具来杀死SysInternals PsKill和SysInternals PsList等进程 。

您也可以使用内build的tasklist.exe和taskkill.exe,但这些只能在Windows XP Professional及更高版本(不在家庭版)上使用。

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

这是一个常规的做法:

 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}") } 

使用以下类来终止Windows进程 ( 如果正在运行 )。 我正在使用强制命令行参数/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(); } } 

你将不得不调用一些本地代码,因为恕我直言,没有这样做的库。 由于JNI非常麻烦,所以您可能会尝试使用JNA(Java Native Access)。 https://jna.dev.java.net/

超级kakes写的答案的小变化

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

变成 ..

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

/IMF选项不工作,它不会杀死记事本..而/IM选项实际工作