it-swarm-ko.tech

Java 내에서 실행중인 Win-Processes를 찾아 죽이는 방법?

실행 파일 이름을 알고있는 실행중인 Win 프로세스를 찾는 방법은 Java)입니다. 지금 실행 중인지 확인하고 프로세스를 종료 할 수있는 방법이 필요합니다. 찾았어요.

24
GHad

tasklisttaskkill 명령 행 창 도구를 사용하고 Runtime.exec()을 사용하여 Java에서 호출 할 수 있습니다.

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

 }

예:

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

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

 if (isProcessRunning(processName)) {

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

원하는 기능을 제공하는 작은 API가 있습니다.

https://github.com/kohsuke/winp

Windows 프로세스 라이브러리

3
Daniel Lindner

SysInternals PsKillSysInternals PsList 와 같은 프로세스 종료에 명령 줄 도구를 사용할 수 있습니다.

내장 된 tasklist.exe 및 taskkill.exe를 사용할 수도 있지만 Windows XP Professional 이상) (Home Edition은 아님)에서만 사용할 수 있습니다.

프로그램을 실행하려면 Java.lang.Runtime.exec 를 사용하십시오.

2
arturh

그루비 한 방법은 다음과 같습니다.

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 프로세스 종료 ( 실행중인 경우 ). 강제 명령 줄 인수 /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();
    }
}
1
BullyWiiPlaza

super kakes가 작성한 답변의 작은 변화

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

로 변경 ..

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

/IMF 옵션이 작동하지 않습니다. 메모장을 죽이지 않습니다. .while /IM 옵션은 실제로 작동

0
Harvendra

IMHO는이를 수행하는 라이브러리가 없기 때문에 일부 고유 코드를 호출해야합니다. JNI는 번거롭고 어렵 기 때문에 JNA (Java Native Access)를 사용하려고 할 수 있습니다. https://jna.dev.Java.net/

0
jb.