2008-09-17 4 views

ответ

16

Вы можете использовать инструменты командной строки Windows tasklist и taskkill и называть их с помощью Java с помощью Runtime.exec().

0

Вам придется называть собственный код, так как IMHO нет библиотеки, которая это делает. Поскольку JNI является громоздким и сложным, вы можете попытаться использовать JNA (Java Native Access). https://jna.dev.java.net/

2

Вы можете использовать инструмент командной строки для процессов уничтожения, таких как SysInternals PsKill и SysInternals PsList.

Вы также можете использовать встроенные tasklist.exe и taskkill.exe, но они доступны только в Windows XP Professional и более поздних версиях (не в Home Edition).

Используйте java.lang.Runtime.exec для выполнения программы.

3

Существует несколько API обеспечения требуемой функциональности:

https://github.com/kohsuke/winp

Windows, Библиотека процессов

+0

Есть ли хороший URL для этого API? – dumbledad 2012-08-02 07:49:43

+1

исправил ссылку. – andreas 2013-01-14 08:47:39

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

Вот заводной способ сделать это:

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}") 
} 
0

небольшое изменение в ответ написан Супер kakes

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

Изменен ..

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

/IMF вариант оленья кожа работа .it не убивает notepad..while /IM вариант на самом деле работает

1

Используйте следующий класс: kill a Windows process (if it is running). Я использую аргумент командной строки силы /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(); 
    } 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^