Существует более простой способ сделать это с помощью Java JNA.
Это определенно работает для Windows и Linux, я предполагаю, что вы можете сделать то же самое и для других платформ.
Самая большая проблема обработки Java-процессов - это отсутствие метода для получения идентификатора процесса, запущенного с помощью untime.getRuntime (). Exec ().
Предполагая, что вы получили pid процесса, вы всегда можете запустить команду kill -9 в linux или использовать аналогичные способы для уничтожения процесса в windows.
Вот способ получения идентификатора процесса для linux (заимствован из платформы selenium :)), и с помощью JNA это также может быть сделано для окон (с использованием вызовов Windows API API).
Чтобы это работало (для Windows), вам сначала нужно получить библиотеку JNA по адресу JAVA NATIVE ACCESS (JNA): Загрузите или получить ее по maven
Посмотрите на следующий код, который получит pid программы (в этом примере Windows) (большая часть кода на самом деле является мусором для запуска работающей java-программы):
import com.sun.jna.*;
import java.lang.reflect.Field;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Main {
static interface Kernel32 extends Library {
public static Kernel32 INSTANCE = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class);
public int GetProcessId(Long hProcess);
}
public static void main(String[] args) {
try {
Process p;
if (Platform.isWindows())
p = Runtime.getRuntime().exec("cmd /C ping msn.de");
else if (Platform.isLinux())
p = Runtime.getRuntime().exec("cmd /C ping msn.de");
System.out.println("The PID: " + getPid(p));
int x = p.waitFor();
System.out.println("Exit with exitcode: " + x);
} catch (Exception ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
public static int getPid(Process p) {
Field f;
if (Platform.isWindows()) {
try {
f = p.getClass().getDeclaredField("handle");
f.setAccessible(true);
int pid = Kernel32.INSTANCE.GetProcessId((Long) f.get(p));
return pid;
} catch (Exception ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
} else if (Platform.isLinux()) {
try {
f = p.getClass().getDeclaredField("pid");
f.setAccessible(true);
int pid = (Integer) f.get(p);
return pid;
} catch (Exception ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
}
else{}
return 0;
}
}
Надеюсь, это поможет,;) ...