java执行linux和window命令续集----应用ProcessBuilder

上一篇地址:https://mp.csdn.net/postedit/83857969

     在上次命令中,一直没出现问题,直到前段时间公司所有服务器迁移,项目也随着迁移,介于服务器性能上存在的差异,在执行 while ((rspLine = in.readLine()) != null) {}中出现了进程阻塞,形成死循环状态,其实呢linux命令已经正确执行完,.getInputStream()发生阻塞。找了很多方法不断试,找到了ProcessBuilder,

    ProcessBuilder类是J2SE 1.5在java.lang中新添加的一个新类,此类用于创建操作系统进程,它提供一种启动和管理进程(也就是应用程序)的方法。在J2SE 1.5之前,都是由Process类处来实现进程的控制管理。 
   每个 ProcessBuilder 实例管理一个进程属性集。它的start() 方法利用这些属性创建一个新的 Process 实例。start() 方法可以从同一实例重复调用,以利用相同的或相关的属性创建新的子进程。
下面是代码:

//下面是linux命令,window命令只需要把下面 String[] command = {"/bin/sh","-c",cmds}的"/bin/sh"变成"cmd"。

public static int executeNewFlow(String cmds) {
        logger.info("命令:"+cmds);
        int iden = 0;
        try {
            String[] command = {"/bin/sh","-c",cmds};
            ProcessBuilder pb = new ProcessBuilder(command);
            pb.redirectErrorStream(true);//通过子进程所产生的任何错误输出随后由该对象的start()方法启动将与标准输出合并
            Process p = null;
            BufferedReader br = null;
            try {
                p = pb.start();
                br = new BufferedReader(new InputStreamReader(p.getInputStream()));
                String line = null;
                while ((line = br.readLine()) != null) {
                    logger.info(line);
                }
                int active = p.waitFor();
                System.out.println("==============执行结果==============active:"+active);
                if(active==0) {//命令执行成功,如gradle打包success而不是failed。
                    iden = 1;
                    System.out.println("==============执行成功==============iden:"+iden);
                }
            } catch(Exception ex){
                ex.printStackTrace();
            }finally {
                if (br != null) {
                    br.close();
                }
                if (p != null) {
                    p.destroy();
                }
            }
        }catch (Exception e) {
            e.printStackTrace();
        }
        return iden;
        
    }


版权声明:本文为u012739150原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。