`
kanpiaoxue
  • 浏览: 1782180 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

防止cmd/shell命令执行被IO阻塞卡死的程序

 
阅读更多

 

 参考文章: https://www.baeldung.com/run-shell-command-in-java

 

 

 

package org.kanpiaoxue.util;

import org.apache.commons.io.IOUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.google.common.base.Preconditions;
import com.google.common.base.Strings;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

/**
 * <pre>
 * StreamGobbler.java
 * @author kanpiaoxue<br>
 * @version 1.0
 * Create Time 2014年9月11日 上午10:54:38<br>
 * Description : 外部数据流消费器
 * </pre>
 */
public final class StreamGobbler extends Thread {
    private static final Logger LOGGER = LoggerFactory
            .getLogger(StreamGobbler.class);

    private static final String ERROR_MSG = "error";
    private final InputStream is;
    /**
     * <pre>
     * 是否需要打印错误log
     * </pre>
     */
    private final boolean printErrorLog;

    /**
     * <pre>
     * @param is 输入流
     * @param type 类型
     * </pre>
     */
    public StreamGobbler(InputStream is, String type) {
        super();
        Preconditions.checkNotNull(is, "InputStream is null.");
        Preconditions.checkArgument(!Strings.isNullOrEmpty(type),
                "type is null or empty!");
        this.is = is;
        this.printErrorLog = type.trim()
                .equalsIgnoreCase(ERROR_MSG);
    }

    /*
     * (non-Javadoc)
     * @see java.lang.Thread#run()
     */
    @Override
    public void run() {
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));
        try {
            for (String line = reader.readLine(); line != null; line = reader
                    .readLine()) {
                // 根据标识位打印出不同的log格式
                if (printErrorLog) {
                    LOGGER.debug("{}>{}", ERROR_MSG, line);
                } else {
                    LOGGER.debug(line);
                }
            }
        } catch (IOException e) {
            LOGGER.error(e.getMessage(), e);
        } finally {
            IOUtils.closeQuietly(reader);
        }
    }

}

 

 

 举例如下:下面的代码不完整

String msg = String.format("execute cmd:%s", cmd);
                LOGGER.info(msg);
                Stopwatch w = Stopwatch.createStarted();
                Process process = Runtime.getRuntime().exec(cmd);
                // 消费掉IO流,防止程序被阻塞卡死
                new StreamGobbler(process.getInputStream(), "normal").start();
                new StreamGobbler(process.getErrorStream(), "error").start();

                int exitCode = process.waitFor();
                boolean flag = (0 == exitCode);
                LOGGER.info("{}. exitCode : {}, -->{}! It consumes {}", msg, exitCode, (flag ? "SUCCESS"
                        : "FAILURE"), w.toString());

 

分享到:
评论

相关推荐

    CMD/cmd命令大全

    ### CMD/cmd命令大全 在计算机领域,特别是对于Windows操作系统用户来说,掌握一些基本的命令行操作是非常有用的。本文将详细介绍一份“CMD/cmd命令大全”中列出的一些重要且实用的命令,帮助读者更好地理解和运用...

    shellcmd_v2.1:添加右键菜单项以快速打开CMD/命令提示符/命令行/命令窗口/DOS

    标题“shellcmd_v2.1:添加右键菜单项以快速打开CMD/命令提示符/命令行/命令窗口/DOS”涉及的是一个实用工具,它通过批处理技术为Windows操作系统添加了一个功能,允许用户在桌面、文件夹或任何文件上右键点击,快速...

    右键添加CMD/命令行/命令窗口/命令提示符

    右键添加CMD/命令行/命令窗口/命令提示符(终极版)。自己用批处理写的,这个问题就算终结了吧。哈哈。 有什么问题请发邮件至邮箱。

    java控制台输入cmd命令, ssh远程linux shell命令, 并打印命令输出到控制台

    在Java编程中,有时我们需要与操作系统进行交互,执行系统级别的命令,例如在控制台执行CMD命令或者通过SSH连接远程Linux服务器执行shell命令。这在自动化脚本、系统管理或者远程监控等场景中非常常见。本篇文章将...

    andorid使用jni执行shell命令例子

    // 处理命令执行后的结果 } // ... } ``` 最后,关于"logSystem"这个文件名,可能是日志文件,记录了执行shell命令时的一些系统级信息。在实际开发中,我们通常会将shell命令的执行结果或错误信息记录到日志,...

    vbs执行CMD命令and导出命令结果

    除了直接在CMD窗口中查看命令执行的结果之外,还可以将结果保存到文件中以便后续处理或分析。这种方式对于自动化脚本来说尤其有用。 #### 5. 实现细节 - 在VBS脚本中使用`&gt;`操作符可以轻松实现将命令结果保存到...

    delphi cmd 获取命令返回(源码)

    当命令执行完成后,我们可以在事件处理器中获取并处理CMD的输出。 值得注意的是,`cmd /c`前缀是告诉CMD执行完指定的命令后立即退出。如果命令返回结果包含多行,可以通过`OutputData`事件来逐行处理。如果需要捕获...

    C#winform执行cmd命令

    在设计视图中,添加一个TextBox控件让用户输入CMD命令,一个Button控件触发命令执行,还可以添加一个RichTextBox控件用于显示命令执行的结果。在TextBox中,用户可以输入如"dir"、"ping"等常见的CMD命令,而在Button...

    在python 中实现运行多条shell命令

    - **解析**:`subprocess.call`与`subprocess.Popen`类似,但会等待命令执行完毕,并返回命令的退出状态码。这使得我们可以根据返回值来判断命令是否成功执行。 #### 二、使用`os`模块 除了`subprocess`模块外,还...

    VC++实现CMD命令执行与获得返回信息

    本文将深入探讨如何使用VC++6.0通过`CreateProcess`执行CMD命令,并利用命名管道(Named Pipe)来获取命令执行后的返回信息。 首先,`CreateProcess`是Windows API中用于创建新进程和子进程的关键函数。它接受一...

    c++执行cmd命令

    c++执行cmd命令c++执行cmd命令c++执行cmd命令c++执行cmd命令c++执行cmd命令c++执行cmd命令

    android通过jni执行shell命令

    JNI在各种场景下都非常有用,比如性能优化、利用系统底层功能或者如本例所示,执行系统级别的操作,例如运行shell命令。本文将深入探讨如何使用JNI在Android中执行shell命令。 首先,理解JNI的工作原理是必要的。...

    从Linux程序中执行shell(程序、脚本)并获得输出结果

    如果只需要简单的命令执行和少量的输出,`popen`可能是最佳选择。对于更复杂的场景,如处理大量数据或需要精确控制子进程,匿名管道或临时文件可能更为合适。总的来说,了解这些方法的优缺点可以帮助你在不同情况下...

    易语言控制台调用CMD命令源码

    在易语言中,我们可以使用控制台调用CMD(命令提示符)命令来执行系统级别的操作,如文件管理、系统信息查询等。这篇源码教程主要关注的是如何在易语言环境下实现这一功能。 首先,我们需要了解CMD命令的基本概念。...

    Excel 调用Shell命令执行bash脚本和命令行代码-VBA源码.rar

    总结来说,Excel调用Shell命令执行Bash脚本和命令行代码的关键在于VBA的Shell函数,它允许我们通过Excel界面与操作系统进行交互。通过这种方式,我们可以利用Excel的强大计算能力,结合Bash脚本的灵活性,创建出功能...

    python 执行shell命令并将结果保存的实例

    首先,我们来看如何将shell命令执行的结果保存到字符串中。在Python中,可以利用subprocess模块提供的Popen类来创建子进程,从而执行shell命令。以下是一个具体的实例代码,展示了如何完成这个操作。 方法一:将...

    C#-WinForm执行CMD命令

    // 显示命令执行结果 txtResult.Text = result; // 假设txtResult是一个TextBox控件,显示命令输出 } ``` 在这个例子中,`btnExecute_Click`是按钮点击事件处理程序,它获取用户在文本框`txtCommand`中输入的命令...

    易语言控制台调用CMD命令

    在易语言控制台调用CMD命令的实践中,我们还可以遇到一些常见的问题,比如命令执行权限不足、命令格式错误、命令执行超时等。为了解决这些问题,我们需要对CMD命令的语法有深入理解,同时熟悉易语言中处理错误和异常...

    Java程序执行CMD命令代码实现

    Java程序是如何执行CMD命令的,就是需要RunTime、Process类而已。 具体代码在文档中

    VB 执行CMD命令返回结果

    这主要涉及到了VB的外壳交互(Shell Interaction)功能,通过这个功能,开发者可以调用操作系统命令行工具,如CMD,执行各种系统命令,并获取命令执行后的结果。下面将详细介绍如何在VB中实现这一功能。 首先,我们...

Global site tag (gtag.js) - Google Analytics