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());
            }
        }
    }
}

Java操作shell脚本相关推荐

  1. 脚本运行显示服务器超时,java执行shell脚本超时

    java执行shell脚本超时 [2021-02-11 04:20:34]  简介: 系统运维 在数据库运维的过程中,Shell 脚本在很大程度上为运维提供了极大的便利性.而shell 脚本参数作为变 ...

  2. java无阻塞执行脚本,JAVA调用Shell脚本-及阻塞的解决方法

    JAVA调用Shell脚本--及阻塞的解决办法 用java调用shell,使用 Process p=Runtime.getRuntime().exec(String[] cmd); Runtime.e ...

  3. Java操作linux脚本

    近期在实现Java调用linux命令及脚本实现数据的批处理,文件的生成,下面记录下我所有遇见的问题 1.sqlplus ip等配置 1.sqlplus username/password 连接本机数据 ...

  4. shell监控java接口服务_Linux系统下Java通过shell脚本监控重启服务

    简介 最近运维人员提出需求,增加一个运维页面, 查询当前的业务进程信息包括:进程名称.启动命令.启动时间.运行时间等,可以通过页面点击重启按钮,可以重启后端的一系列系统进程. 思路 java程序获取l ...

  5. java调用shell脚本及注意事项

    需求: get方法下载远程zip包,然后zip包解压,取出第一级目录再次进行压缩获取新的压缩zip包. 问题: 如果选择使用java代码的IO流操作,在不确定zip包大小的情况下可能会占用很大的内存, ...

  6. java调用shell脚本_Java 执行Shell脚本指令

    一.介绍 有时候我们在Linux中运行Java程序时,需要调用一些Shell命令和脚本.而Runtime.getRuntime().exec()方法给我们提供了这个功能,而且Runtime.getRu ...

  7. java执行shell脚本 process.waitFor()返回1

    记录一下今天遇到的一个问题 在java代码中执行shell脚本,部分代码如下 Process p = null; List<String> cmds = new ArrayList< ...

  8. JAVA调用shell脚本实例

    2019独角兽企业重金招聘Python工程师标准>>> ~/testcode/HelloWorld.java源码文件 1 public class HelloWorld{   2   ...

  9. java 远程shell脚本_java通过ssh连接服务器执行shell命令详解及实例

    java通过ssh连接服务器执行shell命令详解 java通过ssh连接服务器执行shell命令:JSch 是SSH2的一个纯Java实现.它允许你连接到一个sshd 服务器,使用端口转发,X11转 ...

最新文章

  1. select sqlite 唯一_SQLite Select 语句
  2. [HNOI2009]最小圈 (二分答案+负环)
  3. js中加载指定的html代码,在js或JQuery中怎样判断页面html代码中含有指定名称的div元素...
  4. mysql group concat_MySQL 的 GROUP_CONCAT 函数详解
  5. Codeplus2017 12月赛——可做题1
  6. C++算法学习(力扣:134. 加油站)
  7. 资料:线性代数与空间解析几何知识点全汇总
  8. ActiveX插件在关闭IE窗口时使得IE崩溃
  9. android文件恢复,安卓手机文件丢失了,如何恢复?
  10. 中国联通广州软件研究院 软件开发岗二面(技术面)
  11. 骑行听音乐用什么耳机,盘点几款适合在出行佩戴的耳机
  12. 【经历分享】三本大学小菜鸡,最后四个月自学编程经验分享
  13. php generator 风雪,PHP 生成器Generator理解
  14. Linux——Linux账号与群组
  15. 免费的mysql空间
  16. SAP:MIGO校验自定义字段增强
  17. 虚幻四视角移动与场景搭建
  18. 视频压缩 ffmpeg
  19. 太阳同步轨道卫星 理解内容
  20. 计算机网络原理综合考核,计算机网络原理考试重点

热门文章

  1. 关于怎么怎么把 unsingned char 数据转换为 Opencv 的Mat类型,并且吧图像显示出来
  2. 密码学入门1——凯撒密码和三重DES加解密
  3. jq js json 转字符串_JS中JSON对象和String之间的互转及处理技巧
  4. opendds开发指南中文版_最强的开发者技术路线图已经更新到 2020 GitHub 超 118k还有中文...
  5. angular接口传参
  6. 利用协议代理实现导航控制器UINavigationController视图之间的正向传值和反向传值...
  7. PHP常用的正则表达式(有些需要调整)
  8. 如何查看数据文件或者Log文件是否增长过?
  9. Weblogic EJB 学习笔记(3)精
  10. php源码编程,10个小技巧让你做好php源码编程