【问题标题】:Not able to run specific terminal commands from java program(Eclipse)无法从 java 程序(Eclipse)运行特定的终端命令
【发布时间】:2012-12-10 06:33:18
【问题描述】:

在 JAVA 中使用 ProcessBuilder 我能够运行简单的终端命令,如 ls、pwd、echo 等..etc... 但是下面的代码被终止了,不知道为什么??

public static void main(String[] args) throws Exception
{
    Runtime r = Runtime.getRuntime();
    Process p = r.exec("echo 'T W O N E I G H T' | /home/saj/g2p/mosesdecoder-master/bin/moses -f /home/saj/g2p/working/binarised-model/moses.ini");
    p.waitFor();

    BufferedReader b = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String line = "";
    while ((line = b.readLine()) != null) 
    {
      System.out.println(line);
    } 
}

这个命令可以在终端上完美运行,运行大约需要 15 秒并给出输出。 我在 stackoverflow 上浏览过类似的主题,但没有找到任何帮助。 请在这方面提供帮助。 提前致谢。

【问题讨论】:

  • But following code is getting terminated ...您遇到什么异常或错误?

标签: java eclipse ubuntu exec processbuilder


【解决方案1】:

参考此代码,这可能对您有所帮助....使用 bash。只需将您的命令替换为 echo 命令

ProcessBuilder b = new ProcessBuilder("bash","-c","echo abc");

    Process termProc = null;

    try {
        termProc = b.start();
        BufferedReader stdInput = new BufferedReader(new 
        InputStreamReader(termProc.getInputStream()));
        BufferedReader stdError = new BufferedReader(new 
        InputStreamReader(termProc.getErrorStream()));

        String s = null;
        while ((s = stdInput.readLine()) != null) 
        {
            System.out.println(s);


         }
        while ((s = stdError.readLine()) != null) 
        {

            System.out.println(s);

        }

    } catch (IOException e) {

        e.printStackTrace();
    }

【讨论】:

    【解决方案2】:

    考虑同时监控 InputStream 和 ErrorStream。输出可能会写入 ErrorStream,这就是为什么您看不到任何显示的原因。

    来自 Javaworld 的Here's a good example 关于 Runtime.exec() 的一些常见缺陷以及如何使用它。


    我在第一次查看您的代码时错过了它,但这里提示您可能做错了什么:

    因为一些原生平台只提供有限的缓冲区大小 标准输入输出流,未能及时写入输入 流或读取子进程的输出流可能会导致 子进程阻塞,甚至死锁。

    考虑按照以下方式更新您的代码:

    public static void main(String[] args) throws Exception
    {
        Runtime r = Runtime.getRuntime();
        Process p = r.exec("echo 'T W O N E I G H T' | /home/saj/g2p/mosesdecoder-master/bin/moses -f /home/saj/g2p/working/binarised-model/moses.ini");
    
        BufferedReader b = new BufferedReader(new InputStreamReader(p.getInputStream()));
        String line = "";
        while ((line = b.readLine()) != null) 
        {
          System.out.println(line);
        } 
    
        BufferedReader b = new BufferedReader(new InputStreamReader(p.getErrorStream()));
        String line = "";
        while ((line = b.readLine()) != null) 
        {
          System.out.println(line);
        } 
    
        p.waitFor();
    }
    

    注意:我建议创建线程来处理显示来自输入流和错误流的输出,如我在上面发布的示例链接中所示。

    【讨论】:

    • 好的,我会试试你说的......但是为什么它会在 2-3 秒内终止......它应该在大约 15 秒内运行。
    • @saj1919:好吧,我猜你遇到了某种异常,这就是为什么进程没有按照你想要的方式运行。我建议您同时监控错误流的原因之一
    • 现在我尝试了这个,但我得到的结果仍然相同。终止 b = new BufferedReader(new InputStreamReader(p.getErrorStream()));行 = ""; while ((line = b.readLine()) != null) { System.out.println(line); }
    • @saj1919:你能发布你更新的代码吗?当您说终止时,您是否遇到任何异常?
    • 我得到这个输出...=> 'T W O N E I G H T' | /home/saj/g2p/mosesdecoder-master/bin/moses -f /home/saj/g2p/working/binarised-model/moses.ini 没有例外!!
    猜你喜欢
    • 1970-01-01
    • 2015-12-17
    • 2015-10-19
    • 2015-05-25
    • 2013-02-27
    • 2018-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多