在Linux中,当我运行java.lang.Process对象上的destroy函数(这是真正的types化的java.lang.UNIXProcess)时,它发送一个SIGTERM信号来处理,有没有办法用SIGKILL来杀死它?
检查进程是否仍在运行?
通过正在运行的进程获取已用库的列表(unix)
ImportError:没有在Windows上使用django_mysql命名termios的模块
进程的默认堆
Windows SDK – C# – debugging进程退出,错误代码为-1073741502
不使用纯Java。
最简单的方法是使用Runtime.exec()作为外部进程运行kill -9 <pid>命令。
不幸的是,掌握PID并不那么简单。 您将需要使用反射黑魔法来访问private int pid字段,或者混淆ps命令的输出。
更新 – 实际上,还有另一种方法。 创建一个将运行真正的外部应用程序的小工具(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); }
自Java 1.8以来
您可以调用destroyForcibly()方法,默认情况下调用destroy()方法,但根据Java文档, ProcessBuilder或Runtime.exec()返回的所有子流程都实现此方法。
如果你知道进程名称,你可以使用pkill
Runtime.getRuntime().exec("pkill firefox").waitFor();