上一篇地址: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;
}