Ответ 1
Есть более простой способ сделать это с помощью Java JNA.
Это определенно работает для Windows и Linux, я предполагаю, что вы можете сделать то же самое и для других платформ.
Самая большая проблема обработки Java-процессов - это отсутствие метода для получения идентификатора процесса, запущенного с помощью untime.getRuntime(). Exec().
Предполагая, что вы получили pid процесса, вы всегда можете запустить команду kill -9 в linux или использовать аналогичные способы для уничтожения процесса в windows.
Вот способ получения идентификатора процесса для linux (заимствован из платформы selenium, :)), и с помощью JNA это также можно сделать для окон (с использованием вызовов API Windows).
Чтобы это работало (для 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;
}
}
Надеюсь это поможет, ;)...