it-swarm-id.com

Bagaimana menemukan dan membunuh menjalankan Proses-Win dari dalam Java?

Saya perlu cara Java untuk menemukan proses Win yang sedang berjalan dari mana saya tahu nama executable. Saya ingin melihat apakah itu sedang berjalan sekarang dan saya perlu cara untuk mematikan proses jika saya menemukannya.

22
GHad

Anda dapat menggunakan alat windows baris perintah tasklist dan taskkill dan memanggil mereka dari Jawa menggunakan 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);

 }

CONTOH:

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

Ada sedikit API yang menyediakan fungsionalitas yang diinginkan:

https://github.com/kohsuke/winp

Perpustakaan Proses Windows

3
Daniel Lindner

Anda bisa menggunakan alat baris perintah untuk membunuh proses seperti SysInternals PsKill dan SysInternals PsList .

Anda juga dapat menggunakan tasklist.exe built-in dan taskkill.exe, tetapi itu hanya tersedia di Windows XP Profesional dan yang lebih baru (tidak dalam Home Edition).

Gunakan Java.lang.Runtime.exec untuk menjalankan program.

2
arturh

Inilah cara asyik melakukannya:

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

Gunakan kelas berikut untuk mematikan proses Windows ( jika sedang berjalan ). Saya menggunakan argumen command line force /F untuk memastikan bahwa proses yang ditentukan oleh argumen /IM akan dihentikan.

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

perubahan kecil dalam jawaban yang ditulis oleh Super kakes

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

Diubah menjadi ..

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

Opsi /IMF tidak berfungsi. ia tidak membunuh notepad..sementara /IM sebenarnya berfungsi

0
Harvendra

Anda harus memanggil beberapa kode asli, karena IMHO tidak ada perpustakaan yang melakukannya. Karena JNI rumit dan sulit, Anda mungkin mencoba menggunakan JNA (Java Native Access). https://jna.dev.Java.net/

0
jb.