使用“java.lang.ProcessBuilder”执行shell命令`

使用“java.lang.ProcessBuilder”执行shell命令`,java,coldfusion,railo,Java,Coldfusion,Railo,我用CFML编写了下面的小脚本,它执行一个shell命令,我的问题是输出,只要输出是一行就可以了,如果是多行,我只得到第一行,我尝试在脚本上执行while循环(对代码进行了注释)但是不工作,Java抛出一个内存错误Java.lang.OutOfMemoryError:Java堆空间。我能做什么 <cfscript> str = ":>exec uname"; exec_init=str.split(":>exec "); exec=exec_init[2].s

我用CFML编写了下面的小脚本,它执行一个shell命令,我的问题是输出,只要输出是一行就可以了,如果是多行,我只得到第一行,我尝试在脚本上执行while循环(对代码进行了注释)但是不工作,Java抛出一个内存错误
Java.lang.OutOfMemoryError:Java堆空间
。我能做什么

<cfscript>
  str = ":>exec uname";
  exec_init=str.split(":>exec ");
  exec=exec_init[2].split(" ");
  p = createObject("java","java.lang.ProcessBuilder").init(exec).start();
  i = createObject("java","java.io.InputStreamReader").init(p.getInputStream());
  br = createObject("java","java.io.BufferedReader").init(i);
  line=br.readLine();
  //while (isDefined("line")) {
   //writeoutput(line);
  //}
  br.close();
  i.close();
</cfscript>

<cfdump var="#line#">

str=“:>exec uname”;
exec_init=str.split(“:>exec”);
exec=exec_init[2]。拆分(“”);
p=createObject(“java”、“java.lang.ProcessBuilder”).init(exec.start();
i=createObject(“java”,“java.io.InputStreamReader”).init(p.getInputStream());
br=createObject(“java”、“java.io.BufferedReader”).init(i);
line=br.readLine();
//而(定义为“行”){
//写输出(行);
//}
br.close();
i、 close();
输出:

Linux

如果我发出这样的命令

ls

通过多行输出,我得到了例如

README.TXT

相反:


README.TXT VERSION.TXT\uuo-Railo Getting Started-\uo.html bin etc jre lib license-eplv10-aslv20.html modules notice.html资源start start start.d start.ini start.jar stop webapps
发现问题,我需要再次添加
line=br.readLine()在我的循环中。工作代码:

<cfscript>
  str = ":>exec ls -al";
  exec_init=str.split(":>exec ");
  exec=exec_init[2].split(" ");
  p = createObject("java","java.lang.ProcessBuilder").init(exec).start();
  i = createObject("java","java.io.InputStreamReader").init(p.getInputStream());
  br = createObject("java","java.io.BufferedReader").init(i);
  line = br.readLine();
  while (isDefined("line")) {
   writeoutput(line);
   line = br.readLine();
  }
  br.close();
  i.close();
</cfscript>

str=“:>exec ls-al”;
exec_init=str.split(“:>exec”);
exec=exec_init[2]。拆分(“”);
p=createObject(“java”、“java.lang.ProcessBuilder”).init(exec.start();
i=createObject(“java”,“java.io.InputStreamReader”).init(p.getInputStream());
br=createObject(“java”、“java.io.BufferedReader”).init(i);
line=br.readLine();
而(定义为“行”){
写输出(行);
line=br.readLine();
}
br.close();
i、 close();

什么是“内存错误”?加上你得到的真实错误以及你在哪里得到的错误。现在,您的代码只读取一行,因此逻辑上,它将只接收一行。我知道我的代码只读取一行,你知道如何读取它们吗?有没有理由不使用cfexecute?我知道cfexecute没有提供给您的几个特性(工作目录、环境变量和作为输入流的结果),但是您的代码示例似乎没有显示对这些特性的需求。如果您只想在收集完整个输出字符串后使用它,那么只需运行cfexecute.(编辑)就更容易了,不要忘记处理错误流以及输出。如果需要,您可以使用“关于提示的感谢”将错误流重定向到标准输出!知道怎么做吗?可以像使用p.getInputStream()一样单独阅读
getErrorStream()
,或者使用
ProcessBuilder.redirectErrorStream(true)
将错误写入标准流。对于后者,必须将
init()
start()
调用分成两行,以便访问ProcessBuilder对象。另外,如果要等待进程完成,请使用
p.waitFor()
并检查exitValue以获取最终状态。如果为0,则您知道发生了错误。谢谢!我感谢你的帮助!我会的。