我怎么能用SIGKILL Process杀死Java中的Linux进程.destroy()做SIGTERM
在Linux中,当我在java.lang.Process对象(这是真正的类型java.lang.UNIXProcess)上运行销毁函数时,它会发送一个SIGTERM信号进行处理,有没有办法用SIGKILL杀死它?
在Linux中,当我在java.lang.Process对象(这是真正的类型java.lang.UNIXProcess)上运行销毁函数时,它会发送一个SIGTERM信号进行处理,有没有办法用SIGKILL杀死它?
不使用纯 Java。
最简单的替代方法是使用将命令作为外部进程运行。Runtime.exec()
kill -9 <pid>
不幸的是,掌握PID并不是那么简单。您要么需要使用反射黑魔法来访问字段,要么弄乱命令的输出。private int pid
ps
更新 - 实际上,还有另一种方法。创建一个小实用程序(C程序,shell脚本,等等),它将运行真正的外部应用程序。对实用程序进行编码,以便它记住子进程的 PID,并为 SIGTERM 设置一个信号处理程序,该处理程序将 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);
}