我怎么能用SIGKILL杀死一个java进程中的Linux进程Process.destroy做SIGTERM

在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();

相关文章

摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠...
摘要: 原创出处 https://www.bysocket.com 「公众号:泥瓦匠...
今天犯了个错:“接口变动,伤筋动骨,除非你确定只有你一个...
Writer :BYSocket(泥沙砖瓦浆木匠)微 博:BYSocket豆 瓣:...
本文目录 线程与多线程 线程的运行与创建 线程的状态 1 线程...