it-swarm-vi.tech

Làm cách nào để tìm và diệt Win-Processes đang chạy trong Java?

Tôi cần một cách Java để tìm một quy trình Win đang chạy mà từ đó tôi biết để đặt tên cho tệp thực thi. Tôi muốn xem liệu nó có chạy ngay bây giờ không và tôi cần một cách để giết quá trình nếu tôi tìm thấy nó.

22
GHad

Bạn có thể sử dụng các công cụ cửa sổ dòng lệnh tasklisttaskkill và gọi chúng từ Java bằng cách sử dụng Runtime.exec().

16
Marcin
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);

 }

THÍ DỤ:

public static void main(String args[]) throws Exception {
 String processName = "WINWORD.EXE";

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

 if (isProcessRunning(processName)) {

  killProcess(processName);
 }
}
38
1-14x0r

Có một API nhỏ cung cấp chức năng mong muốn:

https://github.com/kohsuke/winp

Thư viện tiến trình Windows

3
Daniel Lindner

Bạn có thể sử dụng một công cụ dòng lệnh để tiêu diệt các tiến trình như SysIternals PsKillSysIternals PsList .

Bạn cũng có thể sử dụng tasklist.exe và taskkill.exe tích hợp, nhưng chúng chỉ khả dụng trên Windows XP Professional và phiên bản mới hơn (không phải trong Phiên bản gia đình).

Sử dụng Java.lang.R nb.exec để thực thi chương trình.

2
arturh

Đây là một cách tuyệt vời để làm điều đó:

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

Sử dụng lớp sau để giết tiến trình Windows ( nếu nó đang chạy ). Tôi đang sử dụng đối số dòng lệnh bắt buộc /F để đảm bảo rằng quy trình được chỉ định bởi đối số /IM sẽ bị chấm dứt.

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();
    }
}
1
BullyWiiPlaza

thay đổi nhỏ trong câu trả lời được viết bởi Super kakes

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

Thay đổi để ..

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

Tùy chọn /IMF không hoạt động. Nó không giết notepad..trong khi tùy chọn /IM thực sự hoạt động

0
Harvendra

Bạn sẽ phải gọi một số mã riêng, vì IMHO không có thư viện nào làm điều đó. Vì JNI cồng kềnh và khó tính, bạn có thể thử sử dụng JNA (Truy cập gốc Java). https://jna.dev.Java.net/

0
jb.