如何从 Java 中运行的进程中获取 bash 命令退出代码?

Posted

技术标签:

【中文标题】如何从 Java 中运行的进程中获取 bash 命令退出代码?【英文标题】:How do I get the bash command exit code from a Process run from within Java? 【发布时间】:2011-05-04 16:49:12 【问题描述】:

我有一个程序是:

import java.io.*;
   import java.util.*;

   public class ExecBashCommand 
     public static void main(String args[]) throws IOException 

       if (args.length <= 0) 
         System.err.println("Need command to run");
         System.exit(-1);
       

       Runtime runtime = Runtime.getRuntime();
       Process process = runtime.exec("./nv0914 < nv0914.challenge");
       Process process1 = runtime.exec("echo $?");
       InputStream is = process1.getInputStream();
       InputStreamReader isr = new InputStreamReader(is);
       BufferedReader br = new BufferedReader(isr);
       String line;

       //System.out.printf("Output of running %s is:", Arrays.toString(args));

       while ((line = br.readLine()) != null) 
         System.out.println(line);
       

     
     

注意:nv0914 是一个 bash 可执行文件,而 nv0914.challenge 是一个文本文件。 当我在终端中运行任何正常命令时,然后如果我使用echo $? 检查退出代码。现在我想通过使用程序来做同样的事情,但程序只是给出输出$?。请帮帮我!

【问题讨论】:

process.exitValue() 有什么问题? 我回滚了对问题的最后一个更改,其中 OP 部分实施了 Peter Lawrey 提供的解决方案。这是对问题的重大更改,并且确实使未来的读者无法使用,IMO。 【参考方案1】:

Process.waitFor() 返回一个int 这是退出代码返回的地方。如果您启动一个不相关的程序,则不会有以前的退出代码,这就是为什么它不会返回任何有用的东西。

您不能可靠地使用 exitValue(),因为您可以在程序完成之前调用它。你应该只在调用 waitFor() 之后调用它(它会给出相同的退出代码 waitFor() )

来自exitValue 的Javadoc

抛出:IllegalThreadStateException - 如果此 Process 对象表示的子进程尚未终止。

【讨论】:

他认为要 echo 的 argv 在 echo 得到它们之前由 shell 解释,但事实并非如此。 嗨彼得,感谢您的评论..但它给了我一个错误。 @mad-programmer,您需要处理 InterruptedException。 ;) 当我使用 waitFor() 时,它只是给了我一个空白终端,甚至没有一个新的 bash 命令行..只是一个空命令行。 您不会看到 bash 命令行。 waitFor 在 bash 脚本完成之前不会返回。我建议你尝试一些你知道会返回的东西。

以上是关于如何从 Java 中运行的进程中获取 bash 命令退出代码?的主要内容,如果未能解决你的问题,请参考以下文章

如何在从我产生的工作中获取一行标准输出时阻止 bash

在bash脚本中获取命令的子进程

如何让 bash find 在同一进程中运行?

在Java中获取当前进程端口

如何在java中运行异步bash命令?

如何从上一个 bash 命令中获取倒数第二个参数? (在交互式 bash shell 中)