18

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

4

4 回答 4

15

不使用纯Java。

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

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

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

于 2010-06-01T14:09:37.037 回答
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);
}
于 2010-06-01T15:48:55.197 回答
1

If you know process name you can use pkill

Runtime.getRuntime().exec("pkill firefox").waitFor();
于 2015-05-14T21:12:01.163 回答
1

从 Java 1.8 开始

您可以调用方法destroyForcibly(),默认调用destroy()方法,但根据Java docs,所有子流程由该方法返回ProcessBuilderRuntime.exec()实现。

于 2015-07-22T17:35:52.697 回答