强制终止子进程的Java工具/方法

2024-03-31

我正在寻找一个 Java 工具/包/库,可以让我强制杀死 一个子进程。

该工具/包/库必须在 Windows 平台上运行(强制)。 需要对 Linux/Unix 的支持。

我的问题

我的 Java 代码创建了一个子进程,它根本不会对 杀死子进程的标准 Java 方法:process.destroy(),并且, 因为我没有孩子的源代码,所以我无法将其编程为 更好地处理终止请求。

我尝试关闭子进程的错误输入和输出流 在调用 destroy() 之前,并且没有任何效果。

我什至尝试将 ctrlBreak 信号(char=3)直接传递到 child.getOutputStream() 再次收到相同的结果。

我最终找到的解决方法是:

  1. 创建子进程时获取子进程的 PID 这可以在 Windows 中通过比较进程列表来完成 孩子创建之前和之后(getRuntime().exec("tasklist /v"))

  2. 使用孩子的PID发出强制杀死系统命令
    在 Windows 中:getRuntime().exec("taskkill /pid " + childPid + " /f")

但是 - 这是复杂的代码,我不想调试和维护,加上问题 我毫不怀疑,许多其他 java 开发人员以前也遇到过这种情况, 这让我希望这样的 Java 工具/包/库已经存在。

我只是不知道它的名字...

PS:我的子进程是由Runtime.getRuntime().exec(cmd), 但 我使用 ProcessBuilder 得到了相同的行为。


有一种更精简的方法可以使用 Java JNA 来完成此操作。

这绝对适用于 Windows 和 Linux,我认为您也可以对其他平台执行相同的操作。

Java进程处理的最大问题是缺少一种方法来获取由untime.getRuntime().exec()启动的进程的进程ID。

假设你得到了一个进程的pid,你总是可以在linux中启动kill -9命令,或者在windows中使用类似的方法来终止进程。

这是一种在 Linux 上获取本机进程 id 的方法(从 selenium 框架借用,:)),在 JNA 的帮助下,这也可以在 Windows 上完成(使用本机 Windows API 调用)。

为此(对于 Windows),您首先必须在以下位置获取 JNA 库:JAVA NATIVE ACCESS (JNA):下载 https://github.com/java-native-access/jna/releases或者从maven https://mvnrepository.com/artifact/net.java.dev.jna/jna

看下面的代码,它将获取一个(在本例中为 Windows)程序的 pid(大部分代码实际上是让 java 程序运行的碎片):

import com.sun.jna.*;
import java.lang.reflect.Field;
import java.util.logging.Level;
import java.util.logging.Logger;

public class Main {

static interface Kernel32 extends Library {

    public static Kernel32 INSTANCE = (Kernel32) Native.loadLibrary("kernel32", Kernel32.class);

    public int GetProcessId(Long hProcess);
}

public static void main(String[] args) {
    try {
        Process p;

        if (Platform.isWindows())
            p = Runtime.getRuntime().exec("cmd /C ping msn.de");
        else if (Platform.isLinux())
            p = Runtime.getRuntime().exec("cmd /C ping msn.de");

        System.out.println("The PID: " + getPid(p));

        int x = p.waitFor();
        System.out.println("Exit with exitcode: " + x);

    } catch (Exception ex) {
        Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
    }
}

public static int getPid(Process p) {
    Field f;

    if (Platform.isWindows()) {
        try {
            f = p.getClass().getDeclaredField("handle");
            f.setAccessible(true);
            int pid = Kernel32.INSTANCE.GetProcessId((Long) f.get(p));
            return pid;
        } catch (Exception ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    } else if (Platform.isLinux()) {
        try {
            f = p.getClass().getDeclaredField("pid");
            f.setAccessible(true);
            int pid = (Integer) f.get(p);
            return pid;
        } catch (Exception ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    else{}
    return 0;
}
}

希望这可以帮助, ;)...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

强制终止子进程的Java工具/方法 的相关文章

  • 在 mvn 命令中指定 pom.xml 并混合其他项目的目标

    我有多个问题 我可以在 mvn 命令中指定 pom xml 吗 在当前项目上执行 mvn 命令时 我可以混合另一个项目的目标吗 例如 mvn clean otherproject comple otherproject install ot
  • JDK 文档是语言规范的一部分吗?

    只有一名官员Java语言规范 https docs oracle com javase specs jls se8 html index html所有 Java 实现都必须遵守它 API文档怎么样 所有Java实现都需要遵守吗这个版本 ht
  • JVisualVM/JConsole 中的 System.gc() 与 GC 按钮

    我目前正在测试处理 XML 模式的概念验证原型 并围绕一个非常消耗内存的树自动机外部库 我已经获得了源代码 构建 我想绘制 真实峰值 堆 随着模式大小的增加 不同运行的内存消耗 使用的指标符合我的目的并且不会影响问题 或者至少是它的合理近似
  • “java.net.MalformedURLException:未找到协议”读取到 html 文件

    我收到一个错误 java net MalformedURLException Protocol not found 我想读取网络上的 HTML 文件 mainfest uses permission android name android
  • 如何将 Mat (opencv) 转换为 INDArray (DL4J)?

    我希望任何人都可以帮助我解决这个任务 我正在处理一些图像分类并尝试将 OpenCv 3 2 0 和 DL4J 结合起来 我知道DL4J也包含Opencv 但我认为它没什么用 谁能帮我 如何转换成 INDArray 我尝试阅读一些问题here
  • 如何在代理后面安装 Eclipse Neon

    对于 Neon Eclipse 附带了一个安装程序 我在安装程序中找不到任何配置菜单 我的java版本是 java version java version 1 8 0 72 Java TM SE Runtime Environment b
  • 当客户端关闭连接时,Spring StreamingResponseBody 请求线程未清理

    我在控制器中有一个端点 它返回一个StreamingResponseBody 用于向客户端发送文件 其代码大致如下 RestController RequestMapping value api public class Controlle
  • ConcurrentHashMap 内部是如何工作的?

    我正在阅读有关 Java 并发性的 Oracle 官方文档 我想知道Collection由返回 public static
  • 是否可以通过编程方式查找 logback 日志文件?

    自动附加日志文件以支持电子邮件会很有用 我可以以编程方式设置路径 如以编程方式设置 Logback Appender 路径 https stackoverflow com questions 3803184 setting logback
  • 如何检测 Java 字符串中的 unicode 字符?

    假设我有一个包含 的字符串 我如何找到所有这些 un icode 字符 我应该测试他们的代码吗 我该怎么做呢 例如 给定字符串 A X 我想将其转换为 AYXY 我想对其他 unicode 字符做同样的事情 并且我不想将它们存储在某种翻译映
  • Java:如何为山区时间创建 TimeZone 对象?

    必须不禁用夏令时 嗯 在这个清单 http en wikipedia org wiki List of tz database time zones在 zoneinfo 时区名称中 有很多声称是 山地时间 找到最适合您想要的那个 然后使用它
  • Java实现累加器类,提供Collector

    A Collector具有三种通用类型 public interface Collector
  • Freemarker 和 Struts 2,有时它计算为序列+扩展哈希

    首先我要说的是 使用 Struts2 Freemarker 真是太棒了 然而有些事情让我发疯 因为我不明白为什么会发生这种情况 我在这里问是因为也许其他人有一个想法可以分享 我有一个动作 有一个属性 说 private String myT
  • 流中的非终结符 forEach() ?

    有时 在处理 Java Stream 时 我发现自己需要一个非终端 forEach 来触发副作用但不终止处理 我怀疑我可以用 map item gt f item 之类的方法来做到这一点 其中方法 f 执行副作用并将项目返回到流中 但这似乎
  • JMenu 中的文本居中

    好吧 我一直在网上寻找有关此问题的帮助 但我尝试的任何方法似乎都不起作用 我想让所有菜单文本都集中在菜单按钮上 当我使用setHorizontalTextPosition JMenu CENTER 没有变化 事实上 无论我使用什么常量 菜单
  • Java Swing:需要一个高质量的带有复选框的开发 JTree

    我一直在寻找一个 Tree 实现 其中包含复选框 其中 当您选择一个节点时 树中的所有后继节点都会被自动选择 当您取消选择一个节点时 树中其所有后继节点都会自动取消选择 当已经选择了父节点 并且从其后继之一中删除了选择时 节点颜色将发生变化
  • Hamcrest Matchers - 断言列表类型

    问题 我目前正在尝试使用 Hamcrest Matchers 来断言返回的列表类型是特定类型 例如 假设我的服务调用返回以下列表 List
  • OpenCSV:将嵌套 Bean 映射到 CSV 文件

    我正在尝试将 bean 映射到 CSV 文件 但问题是我的 bean 具有其他嵌套 bean 作为属性 所发生的情况是 OpenCSV 遍历属性找到一个 bean 然后进入其中并映射该 bean 内的所有数据 如果找到另一个 bean 它就
  • 泛型、数组和 ClassCastException

    我想这里一定发生了一些我不知道的微妙事情 考虑以下 public class Foo
  • 洪水填充优化:尝试使用队列

    我正在尝试创建一种填充方法 该方法采用用户指定的初始坐标 检查字符 然后根据需要更改它 这样做之后 它会检查相邻的方块并重复该过程 经过一番研究 我遇到了洪水填充算法并尝试了该算法 它可以工作 但无法满足我对 250 x 250 个字符的数

随机推荐

  • 在 Java 7 Update 45 中,不再通过 JNLP 标签“属性”设置系统属性

    我们从附加的 JNLP 运行该应用程序 在 Java 控制台上 我们已使用 D 输出系统属性 JNLP 文件中的属性不再设置 这是我们遇到此类问题的第一个 Java 版本 在 7 Update 40 之前一切都运行良好 我们已对所有 jar
  • 实时搜索:用户输入完毕后开始搜索

    在我的应用程序中 当用户在文本字段中键入内容时 我正在搜索结果 我正在使用 Provider 其中有一个 searchProduct 函数 每次用户在文本字段中键入内容时都会触发该函数 获取结果后 我将调用 notificationList
  • 使用片段的Android功能区菜单

    我使用水平滚动视图对功能区菜单进行了编码 我的代码如下 public class HorzScrollWithListMenuActivity extends Activity MyHorizontalScrollView scrollVi
  • JQuery Mobile 加载更多选项

    知道如何在 JQueryMobile 中实现加载更多选项 在我的应用程序中 我需要提取大量数据 并希望加载前 20 条数据 并让用户通过单击 Listview 最后一行上的 加载更多 数据选项来加载更多数据 这应该有效 loadmore l
  • Oracle Tuxedo 的节省成本替代方案 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Oracle Tuxedo 中间件平台有哪些节省成本的替代方案 可以将现有代码库迁移到该平台 很少有开源
  • Access/SQL Server 2008 使用 Like 加入不起作用

    我提前道歉 因为这个问题在这个网站上多次以各种形式出现 但我尝试实施的解决方案似乎都无法正常工作 而且我找不到可以得到正确答案的已回答问题 我正在为一位同事从事 Access 工作 不过一旦他能够设置服务器 将来可能会使用 SQL 我正在尝
  • elm 中的“<<”运算符是什么意思?

    以下代码取自榆树形式示例 http elm lang org edit examples Intermediate Form elm 第 122 行 什么是 lt lt 运算符的意思是 Field field Field defaultSt
  • EaselJS:单击鼠标更改形状填充颜色

    我在使用 EaselJS 时遇到了困难 基本上我想创建一个简单的网格并突出显示所选的实际元素 var stageWidth 800 stageHeight 600 cell size 50 w 16 h 12 n w h canvas st
  • 为什么 ViewPager2 延迟加载页面? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我决定尝试一下现在可用的新稳定版本ViewPager2 My ViewPager2有很多页面 我正在使用TabLayout为每个页面 片段 提供
  • 单击即可在 FullCalendar 中添加事件

    我正在尝试在 NET 中的日历单元格单击上添加事件 如下所示 http arshaw com js fullcalendar 1 5 3 demos selectable html http arshaw com js fullcalend
  • 如何在 C# 中使用 TaskScheduler 设置“仅在登录时运行”和“运行方式”?

    我有使用 C TaskManager 对象创建任务的代码 在 Windows 7 上它工作正常 但在 Windows XP 可能还有其他 Windows 上它根本不起作用 因为任务的默认用户是系统 因此没有用于显示 GUI 的会话 如果我在
  • 从 DOM 中删除元素并将它们添加回原来的位置

    我有一个模态窗口 我想要发生的事情是在模式打开时从页面中删除某些元素 并在模式关闭后将它们添加回原来的位置 我不想显示 无 因为这只会隐藏它们 我需要将它们实际从页面中删除 所以我有一些 jQuery 需要删除并在计时器之后将它们添加回来
  • PHP 的 shuffle 函数有多随机?

    有谁知道PHP的随机性是什么shuffle 功能 它取决于操作系统吗 它使用 PHP 自己的播种器吗 是否可以使用mt rand 作为发电机 shuffle 函数基于相同的生成器rand 这是基于的系统生成器线性同余算法 http en w
  • 使用“Lazy Eager Loading”返回关系中的第一个元素 [Laravel 5.2]

    我有这样的关系 public function message return this gt hasMany Engine Message 在我的里面Conversation model 对于每次对话 我都需要获取最后一条消息 这是我尝试过
  • 自动为所有可能的线性模型创建公式

    假设我在数据框中有一个训练集train有柱子ColA ColB ColC等 这些列之一指定一个二进制类 例如列Class 具有 是 或 否 值 我正在尝试一些二元分类器 例如 library klaR mynb lt NaiveBayes
  • Xcode 9 - CPU 使用率高 - 风扇最大速度

    自从我升级到 Xcode 9 后 当我在 Xcode 上工作时 我的粉丝就变得疯狂了 当我使用 Storyboards 和 Interface Builder 时 尤其会发生这种情况 Xcode有时会占用100 的CPU 并且名为 Inte
  • Weifenluo Dock Panel Suite:浮动窗口使用其设计尺寸?

    如何使用 Weifenluo Dockpanel 套件使浮动窗口使用其设计尺寸 而不是 Dock Panel 套件的默认尺寸 提示 我尝试了 SF net 上 Dock Panel Suite 论坛的建议 但这似乎不起作用 我自己寻找答案时
  • 为什么我们需要 IEqualityComparer,IEqualityComparer 接口?

    Equal 和 GetHashcode 方法存在于对象类中 并且我们的类型继承了对象基类 直接实现对象的两个方法和使用IComparer接口有什么区别 如果我们覆盖对象的 Equal 和 GetHashCode 并推送到哈希表 它将使用覆盖
  • 使用 serde 序列化结构时如何展平“Vec”字段?

    我有一些 XML 它的标签包含多个同名的同级标签 如下所示
  • 强制终止子进程的Java工具/方法

    我正在寻找一个 Java 工具 包 库 可以让我强制杀死 一个子进程 该工具 包 库必须在 Windows 平台上运行 强制 需要对 Linux Unix 的支持 我的问题 我的 Java 代码创建了一个子进程 它根本不会对 杀死子进程的标