Мне нужен способ Java, чтобы найти запущенный процесс Win, из которого я знаю имя исполняемого файла. Я хочу посмотреть, работает ли он прямо сейчас, и мне нужен способ убить процесс, если я его нашел.
Как найти и убить запущенные Win-процессы из Java?
Ответ 1
Вы можете использовать средства командной строки Windows tasklist
и taskkill
и вызывать их из Java с помощью Runtime.exec()
.
Ответ 2
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);
}
}
Ответ 3
Существует небольшой API, обеспечивающий требуемую функциональность:
https://github.com/kohsuke/winp
Библиотека процессов Windows
Ответ 4
Вы можете использовать инструмент командной строки для процессов уничтожения, таких как SysInternals PsKill и SysInternals PsList.
Вы также можете использовать встроенные tasklist.exe и taskkill.exe, но они доступны только в Windows XP Professional и более поздних версиях (не в Home Edition).
Используйте java.lang.Runtime.exec для выполнения программы.
Ответ 5
Здесь groovy способ сделать это:
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}")
}
Ответ 6
Используйте следующий класс для убить процесс 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();
}
}
Ответ 7
Вам придется называть некоторый собственный код, так как IMHO нет библиотеки, которая это делает. Поскольку JNI является громоздким и сложным, вы можете попытаться использовать JNA (Java Native Access). https://jna.dev.java.net/
Ответ 8
небольшое изменение в ответе, написанное Super kakes
private static final String KILL = "taskkill /IMF ";
Изменено на..
private static final String KILL = "taskkill /IM ";
/IMF
опция doesnot work.it не убивает блокнот.. while /IM
опция действительно работает