如何使用SIGKILL杀死java中的Linux进程Process.destroy()执行SIGTERM

时间:2010-06-01 13:55:56

标签: java linux process kill sigterm

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

4 个答案:

答案 0 :(得分:15)

不使用纯Java。

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

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

更新 - 实际上,还有另一种方法。创建一个运行真实外部应用程序的小实用程序(C程序,shell脚本等)。对该实用程序进行编码,使其记住子进程的PID,并为SIGTERM设置SIGKILL子进程的信号处理程序。

答案 1 :(得分:11)

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

自Java 1.8

以来

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