我如何用SIGKILL杀死java进程中的Linux进程Process.destroy()做SIGTERM
在Linux中,当我运行java.lang.Process对象上的destroy函数(这是真正的类型化的java.lang.UNIXProcess)时,它发送一个SIGTERM信号处理,有没有办法用SIGKILL杀死它?我如何用SIGKILL杀死java进程中的Linux进程Process.destroy()做SIGTERM
不使用纯Java。
最简单的选择是使用Runtime.exec()
作为外部进程运行kill -9 <pid>
命令。
不幸的是,掌握PID并不那么简单。您需要使用反射黑魔法访问private int pid
字段,或者使用ps
命令的输出。
UPDATE - 实际上,还有另外一种方法。创建一个可以运行真正的外部应用程序的小工具(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);
}
在Linux上,我通过java(交互过程)运行命令:nslookup - >谷歌,这挂起了进程,我不能杀死这个过程。所以现在我用你的建议,但它不会终止这个过程,它只是挂起,我不能终止我的程序。我甚至试图手动杀死PID但无济于事,我该怎么办? – 2013-03-15 13:05:49
@Space Rocker:一个简单的kill会发送一个SIGTERM。 “kill -9”发送SIGKILL。尝试“kill -9 -1”:它将SIGKILL发送到进程组中的所有进程,其中pid> 1。但这会起作用。 – 2013-04-09 23:48:51
明确使用第二种方法来获得自我PID。 VisualVM也是这样。前一种方式是丑陋的黑客攻击,它不是跨平台的,并且可能在未来的Java版本中不起作用。 – Espinosa 2013-07-03 17:14:18
如果你知道进程名称,你可以使用pkill
Runtime.getRuntime().exec("pkill firefox").waitFor();
由于Java 1.8
您可以调用方法destroyForcibly()
,它调用destroy()
会见默认情况下是hod,但根据Java文档,所有由ProcessBuilder
或Runtime.exec()
返回的子流程都实现此方法。
不幸的是,目前的实现只是调用'destroy()'。看到这里:https://bugs.openjdk.java.net/browse/JDK-8056139 – Joe 2016-01-26 15:33:22
我可以这样做或在JNI中,虽然我不急于这样做,你怎么知道你想杀死的进程的PID? – ekeren 2010-06-01 14:12:15
首先感谢这些回复。反思和JNI/exec是我的最后手段,我想知道是否有人可以找到一个更优雅的方式来做到这一点。 – ekeren 2010-06-01 14:20:38
我对包装execution子手也很严厉,实际上我的老板对此很难对待:)所以我明白,你知道这样做没有直接的方法。 – ekeren 2010-06-01 14:25:18