it-swarm-tr.com

Çalışan Win İşlemlerini Java içinden bulmak ve öldürmek nasıl?

Yürütülebilir dosyanın adını bildiğim çalışan bir Win işlemi bulmak için Java yöntemine ihtiyacım var. Şu anda çalışıp çalışmadığını görmek istiyorum ve bulursam işlemi öldürmek için bir yola ihtiyacım var.

22
GHad

Komut satırı pencereleri araçlarını tasklist ve taskkill kullanabilirsiniz ve onları Runtime.exec() kullanarak Java'dan çağırabilirsiniz.

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

 }

ÖRNEK:

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

İstenilen işlevselliği sağlayan küçük bir API var:

https://github.com/kohsuke/winp

Windows İşlem Kitaplığı

3
Daniel Lindner

SysInternals PsKill ve SysInternals PsList gibi işlemleri öldürmek için bir komut satırı aracı kullanabilirsiniz.

Ayrıca build-in tasklist.exe ve taskkill.exe'yi de kullanabilirsiniz, ancak bunlar yalnızca Windows XP Professional ve sonraki sürümlerinde bulunur (Home Edition'da değil).

Programı çalıştırmak için Java.lang.Runtime.exec kullanın.

2
arturh

İşte bunu yapmanın harika bir yolu:

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

Windows işlemini öldürmek için aşağıdaki sınıfı kullanın ( çalışıyorsa ). /F argümanı tarafından belirtilen işlemin sonlandırılacağından emin olmak için force komut satırı değişkenini /IM kullanıyorum.

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

süper kakes tarafından yazılmış cevap küçük bir değişiklik

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

.. olarak değiştirildi.

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

/IMF seçeneği çalışmıyor. notepad öldürmez .. bu arada /IM seçeneği aslında işe yarıyor

0
Harvendra

Bazı yerel kodları çağırmanız gerekecektir, çünkü IMHO bunu yapan kütüphane yoktur. JNI hantal ve zor olduğu için JNA'yı (Java Native Access) kullanmayı deneyebilirsiniz. https://jna.dev.Java.net/

0
jb.