我怎么能用SIGKILL杀死一个java进程中的Linux进程Process.destroy()做SIGTERM

在Linux中,当我运行java.lang.Process对象上的destroy函数(这是真正的types化的java.lang.UNIXProcess)时,它发送一个SIGTERM信号来处理,有没有办法用SIGKILL来杀死它?

Solutions Collecting From Web of "我怎么能用SIGKILL杀死一个java进程中的Linux进程Process.destroy()做SIGTERM"

不使用纯Java。

最简单的方法是使用Runtime.exec()作为外部进程运行kill -9 <pid>命令。

不幸的是,掌握PID并不那么简单。 您将需要使用反射黑魔法来访问private int pid字段,或者混淆ps命令的输出。

更新 – 实际上,还有另一种方法。 创建一个将运行真正的外部应用程序的小工具(C程序,shell脚本,不管)。 对实用程序进行编码,以便记住子进程的PID,并为SIGTERM建立一个SIGKILL信号处理程序,以便SIGKILL子进程。

斯蒂芬他的回答是正确的。 我写了他所说的话:

 public static int getUnixPID(Process process) throws Exception { System.out.println(process.getClass().getName()); if (process.getClass().getName().equals("java.lang.UNIXProcess")) { Class cl = process.getClass(); Field field = cl.getDeclaredField("pid"); field.setAccessible(true); Object pidObject = field.get(process); return (Integer) pidObject; } else { throw new IllegalArgumentException("Needs to be a UNIXProcess"); } } public static int killUnixProcess(Process process) throws Exception { int pid = getUnixPID(process); return Runtime.getRuntime().exec("kill " + pid).waitFor(); } 

您也可以通过这种方式获得pid:

 public static int getPID() { String tmp = java.lang.management.ManagementFactory.getRuntimeMXBean().getName(); tmp = tmp.split("@")[0]; return Integer.valueOf(tmp); } 

自Java 1.8以来

您可以调用destroyForcibly()方法,默​​认情况下调用destroy()方法,但根据Java文档, ProcessBuilderRuntime.exec()返回的所有子流程都实现此方法。

如果你知道进程名称,你可以使用pkill

 Runtime.getRuntime().exec("pkill firefox").waitFor();