我需要一种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);
}
} |
您可以使用命令行窗口工具tasklist和taskkill,并使用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/