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

本文介绍了在Java中如何使用ProcessBuilder类执行Linux和Windows命令,解决了在迁移服务器后遇到的进程阻塞问题。ProcessBuilder允许重复调用start()方法创建新进程,并且可以合并标准输出和错误输出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇地址:https://mp.youkuaiyun.com/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;
        
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值