Java操作shell脚本

来源:互联网 发布:知乎 一出国就爱国 编辑:程序博客网 时间:2024/06/10 20:57
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());
            }
        }
    }
}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 人力资源保障 山东省人力资源和社会保障厅 重庆人力资源和社会保障网 人力资源保障局 四川人力资源和社会保障厅 重庆人力资源网 人力资源模块 甘肃省人力资源和社会保障厅 甘肃省人力资源社会保障厅 山东省人力资源社会保障厅 人力资源大模块 人力资源社会保障部 四川省人力和社会保障厅 淄博市人力资源和社会保障网 甘肃人力资源社会保障厅 重庆人力和社会保障网 淄博市人力资源社会保障网 山东省人力资源保障厅 贵阳人力资源网 重庆人力社会保障网 重庆人力资源 广州市人力资源社会保障局 甘肃人力资源保障厅 广州市人力资源和社会保障局 人力社会保障局社保网 深圳市人力资源社会保障局 贵阳人力资源 深圳市人力资源和社会保障局 重庆市人力资源和社会保障局 青岛市人力资源和社会保障局 罗德岛人力资源部 河南省人力资源和社会保障厅 重庆人力资源和社保局网 潍坊市人力资源和社会保障局 台山人才人力资源网 河南省人力资源社会保障厅 重庆市人力资源社会保障局 潍坊市人力资源社会保障局 广州市人力资源保障局 深圳市人力资源保障局 北京市人力资源和社会保障局