有一种更精简的方法可以使用Java JNA来做到这一点。
这绝对适用于Windows和Linux,我假设您也可以为其他平台做同样的事情。
Java进程处理的最大问题是缺乏一种方法来获取使用untime.getRuntime().exec()启动的进程的进程ID。
假设你得到了一个进程的pid,你总是可以在linux中启动kill -9命令,或者使用类似的方法在Windows中杀死一个进程。
这里有一种方法可以为linux本地获取进程ID(从selenium框架借来,:)),并且在JNA的帮助下,这也可以为Windows完成(使用本机Windows API调用)。
要使它工作(对于Windows),您首先必须在JAVA NATIVE ACCESS(JNA)上获取JNA库:下载或从maven获取它
看看下面的代码,它将获得一个(在此示例windows中)程序的pid(大多数代码实际上是碎片,以使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;
}
}
希望这有帮助,;)...