Java操作shell脚本

public class Exec {

private static ILogger logger = LoggerFactory.getLogger(Exec.class);

public Exec() {
super();
}


    /**
     * 执行命令(如Shell脚本)<br>
     * 
     * @param cmd 操作命令
     * @param timeout 超时时间
     * @return 命令执行过程输出内容
     * 
     * @throws IOException
     * @throws TimeoutException
     * @throws InterruptedException
     */
    public String execute(final String cmd, final long timeout) throws IOException, TimeoutException, InterruptedException{
    if(cmd == null || cmd.trim().length() == 0) {
    return null;
    }
    long time = 1000L * 5;
    time = timeout > 0 ? timeout : time;
        
    long begin = System.currentTimeMillis();
   
    logger.info("Begin execute command { " + cmd + " }, timeout = " + time + " seconds.");
        
    //执行命令
    Process process = Runtime.getRuntime().exec(cmd); 
        
        TimeWorker timeWorker = new TimeWorker(process);
        process.getOutputStream().close();
        OutputWorker outputWorker = new OutputWorker(process.getInputStream());
        String result = null;
        outputWorker.start();
        timeWorker.start();
        try {
       
        //任务超时
            timeWorker.join(time);
            if (timeWorker.exit == null) {
                throw new TimeoutException(cmd);
            } else if(timeWorker.exit != 0) {
            logger.error("Execute command " + cmd + " error, error message: " + this.getOutput(process.getErrorStream()));
                result = "error";
            } else {
                result = outputWorker.output;
            }
        } catch (InterruptedException e) {
            timeWorker.interrupt();
            Thread.currentThread().interrupt();
            throw e;
        } finally {
            process.destroy();
        }
        
        long end = System.currentTimeMillis();
        logger.info("Finish execute command { " + cmd + " }, time spent " + (end - begin)/1000L + " seconds.");
   
    return result;
    }
    
    /**
     * 获取IO输出内容 <br>
     * 
     * @param stream 流
     * @return 内容
     * @throws IOException
     */
    private String getOutput(InputStream stream) throws IOException {
    if(stream == null) {
    return null;
    }
        StringBuffer buffer = new StringBuffer();
        BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
        String line = null;
        while((line = reader.readLine()) != null) {
            buffer.append(line + "\n");
        }
        reader.close();
        return buffer.toString().trim();
    }
    
    /**
     * 
     * @author 
     *
     */
    private static class OutputWorker extends Thread {
   
        private final InputStream stream;
        private String output = null;


        private OutputWorker(InputStream stream) {
            this.stream = stream;
        }
        
        public void  run() {
            String line = null;
            StringBuffer buffer=new StringBuffer();
            BufferedReader reader=null;
            try {
                reader = new BufferedReader(new InputStreamReader(stream));
                while((line = reader.readLine()) != null) {
                    buffer.append(line+"\n");
                }
                this.output = buffer.toString().trim();
            } catch (IOException e) {
            logger.error(e.getMessage());
            } finally {
                if(reader!=null) {
                    try {
                        reader.close();
                    } catch (IOException e) {
                    logger.error(e.getMessage());
                    }
                }
            }
        }


    }
    
    /**
     * 
     * @author
     *
     */
    private static class TimeWorker extends Thread {
   
        private final Process process;
        
        private Integer exit = null;


        private TimeWorker(Process process) {
            this.process = process;
        }
        
        public void run() {
            try {
            //阻塞等待命令执行结束
                exit = process.waitFor();
            } catch (InterruptedException e) {
            logger.error(e.getMessage());
            }
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273400.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mysql更新插入

在向表中插入数据的时候&#xff0c;经常遇到这样的情况&#xff1a;1. 首先判断数据是否存在&#xff1b; 2. 如果不存在&#xff0c;则插入&#xff1b;3.如果存在&#xff0c;则更新。 在 SQL Server 中可以这样处理&#xff1a; if not exists (select 1 from t where id …

信息加密之信息摘要加密MD2、MD4、MD5

对于用户数据的保密一直是各个互联网企业头疼的事&#xff0c;那如何防止用户的个人信息泄露呢&#xff1f;今天为大家介绍一种最简单的加密方式--信息摘要算法MD。它如何来保护用户的个人信息呢&#xff1f;其实很简单&#xff0c;当获得到用户的信息后&#xff0c;先对其进行…

Java 从网络上下载文件

/*** 下载文件到本地 */public static void downloadPicture(String imageUrl, String filename){ URL url;try {url new URL(imageUrl);//打开网络输入流DataInputStream dis new DataInputStream(url.openStream());//建立一个新的文件FileOutputStream fos new FileOutp…

An error was encountered while running(Domain=LaunchSerivcesError, Code=0)

今天突然遇到这样一个错误&#xff0c;编译可以通过&#xff0c;但是运行就会弹出这个错误提示&#xff1a; An error was encountered while running(DomainLaunchSerivcesError, Code0) 解决办法就是重置模拟器。 点击模拟器菜单中的Reset Contents and Settings&#xff0c;…

hdu 4091 线性规划

分析转自&#xff1a;http://blog.csdn.net/dongdongzhang_/article/details/7955136 题意 &#xff1a; 背包能装体积为N, 有两种宝石&#xff0c; 数量无限&#xff0c; 不能切割。 分别为 size1 value 1 size2 value2 问背包能装最大的价值&#xff1f; 思路 &#xff…

linux fmt命令

简单的格式化文本 fmt [option] [file-list] fmt通过将所有非空白行的长度设置为几乎相同&#xff0c;来进行简单的文本格式化 参数 fmt从file-list中读取文件&#xff0c;并将其内容的格式化版本发送到标准输出。如果不制定文件名或者用连字符&#xff08;-&#xff09;来替代…

基于 jQuery支持移动触摸设备的Lightbox插件

Swipebox是一款支持桌面、移动触摸手机和平板电脑的jquery Lightbox插件。该lightbox插件支持手机的触摸手势&#xff0c;支持桌面电脑的键盘导航&#xff0c;并且支持视频的播放。 在线预览 源码下载 简要教程 Swipebox是一款支持桌面、移动触摸手机和平板电脑的jQuery Ligh…

简化工作——我的bat文件

重启adb(radb.bat)&#xff1a; echo off call adb kill-server call adb start-server call adb remount push 一个apk(push.bat) echo off if "%1""launcher" ( call adb push 相关apk路径 system/app )else ( echo 请添加一个参数!当前有效…

js操作数据库

<script languagejavascript> function replace(v) { //容错问题&#xff0c;请读者自行进行判断。 //定义SQL语句 var sql select * from Dictionary where MainID v ; //新建数据库连接对象和数据集存取对象 var ConnDB new ActiveXObject(adodb.connection)…

Java中StringBuilder的清空方法比較

StringBuilder 没有提供clear或empty方法。清空有3种方法&#xff1a;1&#xff09;新生成一个&#xff0c;旧的由系统自己主动回收2&#xff09;使用delete3&#xff09;使用setLength 将三种方法循环1000万次&#xff0c;代码&#xff1a; 1.public class sbbm { 2. 3. st…

LinkCutTree 总结

最近学习了LinkCutTree&#xff0c;总结一下。 LinkCutTree是一种数据结构&#xff08;是Tree Decomposition中的一种&#xff09;&#xff0c;她维护的一般是无向图&#xff08;一个森林&#xff09;&#xff0c;支持连边、删边、链修改、链查询&#xff08;点属于特殊的链&am…

linux 数据转换

使用bc 可以进行不同进制之间的转换 digit100; printf "the number is : %d\n" $digit;binary$( echo "obase2;$digit" | bc );printf "result is : %s\n" $binary;digit1$( echo "obase10;ibase2;$binary" | bc );printf "bina…

PHP常用的正则表达式(有些需要调整)

平时做网站经常要用正则表达式&#xff0c;下面是一些讲解和例子&#xff0c;仅供大家参考和修改使用&#xff1a; "^\d$"  //非负整数&#xff08;正整数 0&#xff09; 顺平注: 验证输入id数值&#xff0c;不能为0 $reg1/^[1-9]\d*$/; "^[0-9]*[1-9][0-9]…

浮点数据的运算

使用bc设置scale可以进行相应的浮点运算#!/bin/bash# FileName TestBc.shdigit100;sqrt$(echo "scale3;sqrt($digit) " | bc);echo $sqrt;var$(echo "scale3;10/3" | bc);echo $var;var1$( echo "scale2;0.5*3" | bc);echo $var1;

IE(IE6/IE7/IE8)支持HTML5标签--20150216

让IE&#xff08;ie6/ie7/ie8&#xff09;支持HTML5元素&#xff0c;我们需要在HTML头部添加以下JavaScript&#xff0c;这是一个简单的document.createElement声明&#xff0c;利用条件注释针对IE来调用这个js文件。Opera&#xff0c;FireFox等其他非IE浏览器就会忽视这段代码…

linux shell 求绝对值

abs-1;printf "the number is : %d\n" $abs;printf "abs is : %d\n" $abs;if [ $abs -lt 0 ]; thenlet abs0-$abs;fiprintf "abs is : %d\n" $abs;

PyQt中从RAM新建QIcon对象 / Create a QIcon from binary data

一般&#xff0c;QIcon是通过png或ico等图标文件来初始化的&#xff0c;但是如果图标资源已经在内存里了&#xff0c;或者一个zip压缩文件内&#xff0c;可以通过QPixmap作为桥梁&#xff0c;转换为图标。 zf zipfile.ZipFile("library.zip") # 准备zip文件 pm …

Java中的代码块标记

taga: {for (int k 0; k < 5; k) {System.out.println("kkkkkk: " k);if (k > 3) {break taga;}tagb: for (int i 0; i < 10; i) {System.out.println("i: " i);if (i 2) {break tagb;}}}}

windows中安装zookeeper

Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目&#xff0c;它主要是用来解决分布式应用中经常遇到的一些数据管理问题&#xff0c;如&#xff1a;统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。本文将从使用者角度详细介绍 Zookeeper 的安装和配…

MySQL Event

一、前言自MySQL5.1.6起&#xff0c;增加了一个非常有特色的功能–事件调度器(Event Scheduler)&#xff0c;可以用做定时执行某些特定任务&#xff08;例如&#xff1a;删除记录、对数据进行汇总等等&#xff09;&#xff0c;来取代原先只能由操作系统的计划任务来执行的工作。…