使用“java.lang.ProcessBuilder”执行shell命令`
我用CFML编写了下面的小脚本,它执行一个shell命令,我的问题是输出,只要输出是一行就可以了,如果是多行,我只得到第一行,我尝试在脚本上执行while循环(对代码进行了注释)但是不工作,Java抛出一个内存错误使用“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
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,则您知道发生了错误。谢谢!我感谢你的帮助!我会的。