好的,所以我的情况如下:我需要在Octave(用于高级计算的数学程序)中运行.mod文件(数学模型),得到结果并通过webapp返回给用户。< / p>
真的不是那么多,我有一个应用程序运行顺利,就像我需要在我的windows enviro(开发环境,我用Glassfish 4.0和Eclipse开发它)上使用以下代码:
...
Process p = rt.exec("C:\\Octave\\Octave3.6.4_gcc4.6.2\\bin\\octave.exe --eval \"cd "
+ actingFolder + "; dynare code.mod; save -text saida.txt; exit\"");
InputStream in = p.getInputStream();
while(in.read != -1);
...
然而,当我将它迁移到linux envior(Debian GNU / Linux 7,使用Glassfish 4.0作为AppServer)并调整代码以在所述系统中运行时它停止工作!按照我目前正在尝试运行的代码:
...
p = rt.exec("/bin/bash -c /root/octave --eval \"cd "
+ actingFolder + "; dynare code.mod; save -text saida.txt; exit\" --silent");
InputStream in = p.getInputStream();
while(in.read() != -1);
...
当这段代码运行时,它永远不会结束:in.read()永远不会返回-1(执行结束时的InputStream代码)所以它永远不会停止...而且,当八度运行时它会生成几个退出文件,而不是它们已被创建,我认为该程序无法启动,或者由于某种原因,它被拒绝为webApp创建文件作为Octave应用程序的输出...我不知道真的知道......
你能帮我个忙吗?和
P.S。:
我正在通过运行时运行此应用程序,因为我知道没有更好的方法来使Octave解释.mod。如果还有另一种解决方案,我也会真正做到这一点。
我测试过,我可以100%保证应用程序有权在服务器中创建文件,Octave对我的系统拥有完全权限......我应该能够正确运行它,对吗?
我还能够验证不:程序在shell上运行String时不会产生错误。事实上,即使它似乎忽略了对shell的调用并继续使用应用程序,这意味着两件事:InputStream返回-1(正确结束)并且由于某种原因Octave没有启动......
为什么会这样呢?
是的,Octave及其所有依赖项都已正确安装,而我本人也可以从shell手动调用它。
现在我收到了正在发生的事情!
仍然试图抓住http://www.javaworld.com/article/2071275/core-java/when-runtime-exec---won-t.html?page=2处的所有内容,但是通过在该指南中运行“TestExec”程序,我能够理解一些事情。
首先,至少在我的情况下,Runtime.Exec()将始终在String的beggning处运行程序。他们继续尝试用提供的字符串来提供所述程序,将每个空格视为一个换行符,然后用它来执行程序,直到错误或终止。
在我的情况下,他收到了“--eval”,这是一个Octave命令,因为没有任何参数,它被忽略了。然后它收到“cd \”“并导致错误,因为它不是没有任何地址的Octave命令,导致输入停止。
因此,这解释了为什么它没有导致执行中的任何错误(错误由八度处理,因此不会引发任何异常)以及为什么在进程结束后没有发生任何事情。
我现在正在研究如何在执行期间向Octave输入命令。