我如何用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子进程。

+0

我可以这样做或在JNI中,虽然我不急于这样做,你怎么知道你想杀死的进程的PID? – ekeren 2010-06-01 14:12:15

+0

首先感谢这些回复。反思和JNI/exec是我的最后手段,我想知道是否有人可以找到一个更优雅的方式来做到这一点。 – ekeren 2010-06-01 14:20:38

+0

我对包装execution子手也很严厉,实际上我的老板对此很难对待:)所以我明白,你知道这样做没有直接的方法。 – ekeren 2010-06-01 14:25:18

斯蒂芬他的回答是正确的。我写的是什么,他说:

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); 
} 
+0

在Linux上,我通过java(交互过程)运行命令:nslookup - >谷歌,这挂起了进程,我不能杀死这个过程。所以现在我用你的建议,但它不会终止这个过程,它只是挂起,我不能终止我的程序。我甚至试图手动杀死PID但无济于事,我该怎么办? – 2013-03-15 13:05:49

+0

@Space Rocker:一个简单的kill会发送一个SIGTERM。 “kill -9”发送SIGKILL。尝试“kill -9 -1”:它将SIGKILL发送到进程组中的所有进程,其中pid> 1。但这会起作用。 – 2013-04-09 23:48:51

+0

明确使用第二种方法来获得自我PID。 VisualVM也是这样。前一种方式是丑陋的黑客攻击,它不是跨平台的,并且可能在未来的Java版本中不起作用。 – Espinosa 2013-07-03 17:14:18

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

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

由于Java 1.8

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

+1

不幸的是,目前的实现只是调用'destroy()'。看到这里:https://bugs.openjdk.java.net/browse/JDK-8056139 – Joe 2016-01-26 15:33:22