如何通过进程生成器在 4-5 秒后停止执行命令?

2024-01-02

参考代码 :

ProcessBuilder ps4;
Process pr4 = null;

String batchFile3 = new File(path + "/src/example.sh");

ps4 = new ProcessBuilder(batchFile3.getAbsolutePath());

ps4.redirectErrorStream(true);
ps4.directory(new File(path + "/src/"));

pr4 = ps4.start();

BufferedReade readRun = new BufferedReader(new InputStreamReader(pr4.getInputStream()));



if(pr4.waitFor()==0)
{

}

 String line,stre;   

while ((line = readRun.readLine()) != null) {

     System.out.print("-----" + line);

     if (line != null) {

           stre += line;

    }

}
  • 这里我得到了 str 字符串的结果,它可能是我正在执行的批处理文件生成的错误或输出。

  • 如果执行时间超过 4-5 秒,我想停止执行批处理文件并终止该批处理文件执行进程。

  • 同样在这种情况下,我应该能够返回程序来处理一个块,该块仅在批处理文件处理中发生延迟时才会执行,否则不应处理该块。


据我了解,如果子进程运行时间超过四到五秒,您希望停止它。这不能直接完成ProcessBuilder https://docs.oracle.com/javase/10/docs/api/java/lang/ProcessBuilder.html(您可以看到类中不存在相关方法),但是一旦子流程开始,您就可以很容易地实现此行为。

Calling Process.waitFor() https://docs.oracle.com/javase/10/docs/api/java/lang/Process.html#waitFor--正如您在示例代码中所做的那样是有问题的,因为它会无限期地阻止您当前的线程 - 如果您的进程花费的时间超过五秒.waitFor()不会阻止它。然而.waitFor()已超载且其sibling https://docs.oracle.com/javase/10/docs/api/java/lang/Process.html#waitFor-long-java.util.concurrent.TimeUnit-需要一个timeout争论。

public boolean waitFor(long timeout, TimeUnit unit) throws InterruptedException

如有必要,使当前线程等待,直到此 Process 对象表示的子进程终止,或者指定的等待时间过去。

您可以将其与Process.destroy() https://docs.oracle.com/javase/10/docs/api/java/lang/Process.html#destroy--如果该过程花费太长时间,则停止该过程。例如:

Process process = new ProcessBuilder(command, and, arguments)
    .redirectErrorStream(true)
    .directory(workingDir)
    .start();

process.waitFor(5, TimeUnit.SECONDS);
process.destroy();
process.waitFor(); // wait for the process to terminate

这取决于以下事实:Process.destroy()当在已经完成的子流程上调用时是无操作。在 Java 9 之前,这种行为没有记录,但在实践中一直如此。另一种方法是检查返回值.waitFor(),但这会引入一个托克托竞赛 https://en.wikipedia.org/wiki/Time_of_check_to_time_of_use.

关于什么Process.destroyForcibly() https://docs.oracle.com/javase/10/docs/api/java/lang/Process.html#destroyForcibly--?一般来说,您不应该调用此方法(JDK 可能更清楚的另一件事),但是如果进程确实挂起,则可能有必要。理想情况下,您应该确保您的子流程表现良好,但如果您必须使用.destroyForcibly()我建议这样做:

// Option 2
process.waitFor(5, TimeUnit.SECONDS);  // let the process run for 5 seconds
process.destroy();                     // tell the process to stop
process.waitFor(10, TimeUnit.SECONDS); // give it a chance to stop
process.destroyForcibly();             // tell the OS to kill the process
process.waitFor();                     // the process is now dead

这确保了行为不当的进程将被立即终止,同时仍然为正确实施的程序提供了在收到指示时退出的时间。的确切行为.destroy() and .destroyForcibly()是特定于操作系统的,但在 Linux 上我们可以看到他们对应于SIGTERM and SIGKILL http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/43cb25339b55/src/solaris/native/java/lang/UNIXProcess_md.c#l720:

int sig = (force == JNI_TRUE) ? SIGKILL : SIGTERM;
kill(pid, sig);

您应该很少需要打电话.destroyForcibly() https://stackoverflow.com/q/690415/113632,我建议仅在您发现有必要时才添加它。

选项 2 在概念上类似于使用timeout https://www.gnu.org/software/coreutils/manual/html_node/timeout-invocation.html像这样命令:

$ timeout --kill-after=10 5 your_command

很容易复制Process.waitFor(long, TimeUnit)在 Java 7 中,没有什么神奇之处默认 Java 8 实现 http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/lang/Process.java#l163:

public boolean waitFor(long timeout, TimeUnit unit)
    throws InterruptedException
{
    long startTime = System.nanoTime();
    long rem = unit.toNanos(timeout);

    do {
        try {
            exitValue();
            return true;
        } catch(IllegalThreadStateException ex) {
            if (rem > 0)
                Thread.sleep(
                    Math.min(TimeUnit.NANOSECONDS.toMillis(rem) + 1, 100));
        }
        rem = unit.toNanos(timeout) - (System.nanoTime() - startTime);
    } while (rem > 0);
    return false;
} 
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过进程生成器在 4-5 秒后停止执行命令? 的相关文章

随机推荐

  • Flutter上如何用pop获取返回值?

    我想知道如何在 Flutter 上使用 pop 获取两个值 我尝试编写代码 但我得到了异常 必须向文本小部件提供非空字符串 这是代码 第一屏 ElevatedButton child const Text move to second sc
  • Powershell 将数据传输到外部控制台应用程序

    我有一个可以接受标准输入的控制台应用程序 它缓冲数据直到执行命令 此时它会执行所有数据 并将输出发送到标准输出 目前 我正在从 Powershell 运行该应用程序 将命令通过管道传输到其中 然后解析输出 传入的数据相对较小 然而 该应用程
  • MySQL 中嵌套循环中的多个游标

    我想做一些在 MySQL 中显得有点复杂的事情 事实上 我希望打开一个游标 执行一个循环 并在这个循环中 使用上一个要执行的提取中的数据打开第二个游标 并重新循环结果 DECLARE idind INT DECLARE idcrit INT
  • 如何确定 Signal R 正在使用哪种传输方法

    我正在使用 signal r 服务器和 Web 客户端编写一个测试应用程序 我想知道是否有办法确定或让服务器知道客户端正在与服务器建立哪种传输方法 对于在客户端和服务器之间具有持久双向连接的 websockets 或持续轮询服务器直到服务器
  • 创建具有过滤范围的单元格内下拉列表

    我正在使用谷歌电子表格 为了说明我的问题 我使用范围A2 A8用于数据验证D2 and E2 但因为在细胞内D2 你应该只选择一种动物 我想用以下内容过滤范围B2 B8 我尝试过的是使用我自己的公式 FILTER A2 A8 IS B2 B
  • 当模板类型是基本类型时通过引用传递的成本

    我一直听说确保最佳性能的良好做法是 通过基本类型 int double 按价值 通过常量引用传递类 如今 使用 C 11 并在编译器下进行全面优化 当通过 const 引用传递基本类型时是否会产生开销 而且 当T is int将实现以下功能
  • 如何防止收到的短信到达收件箱?

    我正在开发一个简单的应用程序 它接收但不处理短信 它检查每条传入的短信是否有特定的关键词 如果短信包含该关键字 那么它会做出相应的响应 如果关键字不存在 那么我的应用程序什么也不做 我有这么多工作 我想知道是否有一种方法可以阻止手机上的默认
  • 鼠标移出时关闭 AJAX 控制工具包 BallonPopupExtender

    有人知道如何从客户端关闭 Ballon Popup Extender 吗 一切都很好 但由于我将 BPE 设置为在鼠标悬停时显示 所以它在鼠标移出时没有任何关闭或隐藏方法 这确实不切实际 我尝试过 function hideElement
  • 为什么要刷新由其他逻辑处理器引起的内存顺序冲突的管道?

    The vTune 文档中描述了 Memory Order Machine Clear 性能事件 https software intel com en us vtune amplifier help mo machine clear ov
  • Flex 到 HTML5 - 表示层(canvas、div、???)

    我的问题是关于从 Flex3 迁移到 HTML5 的问题 我实际上想迁移自己而不是应用程序 问题是 什么方向是最好的 和Flex知识最相似的 也许我会重新实现我的 Flex 库中已有的一些自定义组件 我认为我必须在 HTML5 中自己实现一
  • Java中的多态复制

    我突然遇到了一个用Java进行深度多态复制的问题 实施Clonable解决了我的问题 但它通常被称为 坏 技术 因此 我尝试寻找 不可克隆 的解决方案 public class Parent int x public Parent publ
  • C 中空结构的大小是多少?

    据我说 它是零 但似乎有点混乱here https stackoverflow com questions 1626017 why sizeofspinlockt is greater than zero on uni processor
  • 通过套接字使用 boost 发送和接收压缩文件

    在我的项目中 通过套接字读取和写入消息是使用 boost 的 Zlib 过滤器进行压缩的 我想知道如何执行相同的操作files 有什么更好的方法可以提高速度 不使用硬盘将数据保存在缓冲区中 我在使用 boost 传输文件时遇到问题 因此欢迎
  • 带有关闭按钮的 Angular UI Bootstrap 弹出框

    我正在使用 Angular UI Bootstrap 创建弹出窗口 但我找不到在弹出窗口内添加关闭按钮的选项 我自定义了弹出框模板以包含关闭按钮 但我仍然无法找到关闭弹出窗口的函数 事件 环境isOpenfalse 第一次起作用 因为它只是
  • 如何在 PHP-CS-Fixer 中配置 HeaderCommentFixer

    我想用HeaderCommentFixer https github com FriendsOfPHP PHP CS Fixer blob 1 12 Symfony CS Fixer Contrib HeaderCommentFixer p
  • 将 Github 页面重定向到自定义域

    我创建了一个 Github Pages 站点 并将其放在 github 帐户的存储库 abc 上 用户名为 xyz 所以 我的网站现在位于 xyz github io abc 我使用自定义域创建了一个 cname 文件 并使用 Github
  • ClojureScript:如何通过原型向 JS 对象添加方法?

    我正在尝试向现有的 JavaScript 系统添加一些功能 然后再次从 JavaScript 使用 而不是在 ClojureScript 命名空间内 也许这是不可能的 这是我想做的事情的简化 JavaScript String protot
  • 无法使用 Express.js 更改 Favicon

    这是一个非常基本的问题 但我正在尝试使用以下命令更改我的 node js Express 应用程序的图标 app use express favicon dirname public images favicon ico 我仍然得到默认的图
  • 为什么不让每个节点都成为种子节点

    我是卡桑德拉新手 我了解种子节点的用途 但是种子节点有任何相关成本吗 如果是这样 它们是什么 另外 我想知道为什么不让每个节点都成为种子节点 作为种子 基本上没有本地运行时成本 除了您可能会比非种子节点收到更多的八卦流量之外 然而 随着种子
  • 如何通过进程生成器在 4-5 秒后停止执行命令?

    参考代码 ProcessBuilder ps4 Process pr4 null String batchFile3 new File path src example sh ps4 new ProcessBuilder batchFile