Java进程不能获得通过调用Runtime.getRuntime()InputStream的。EXE

2019-08-16 19:37发布

try {

        String str;
        Process process = Runtime.getRuntime().exec("bash /home/abhishek/workspace/Pro/run");
        InputStream isout = process.getInputStream();
        InputStreamReader isoutr = new InputStreamReader(isout);
        BufferedReader brout = new BufferedReader(isoutr);
        while ((str = brout.readLine()) != null) {
            System.out.println(str);
        }

} catch (IOException e) {
        e.printStackTrace();
}

代码已经从过程获得的InputStream,因为如果我从终端运行shell脚本运行完全没问题,但如果我运行脚本这样的,STR总是空,

我使用这个代码来获取shell脚本的输出直接转换成Java,而不是在文件中写入脚本输出

是否有任何其他的方式来实现这一点,或者我怎样才能用目前的办法解决问题

Answer 1:

我想通过错误流回来的东西,所以你可以尝试从Process.getErrorStream查什么()。

你也应该等待创建过程中要防止你的主程序之前它完成。 使用Process.waitFor();

public class TestMain {
   private static final String BASH_CMD = "bash";

   private static final String PROG = "/home/abhishek/workspace/Pro/run";

   private static final String[] CMD_ARRAY = { BASH_CMD , PROG };

   public static void main(String[] args) {
      new Thread(new Runnable() {
         public void run() {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                  System.in));
            String command = null;
            try {
               while ((command = reader.readLine()) != null) {
                  System.out.println("Command Received:" + command);
               }
            } catch (Exception ex) {
               ex.printStackTrace();
               // failed to listening command
            }

         }
      }).start();
      Process process = null;
      try {
         ProcessBuilder processBuilder = new ProcessBuilder(CMD_ARRAY);
         process = processBuilder.start();
         InputStream inputStream = process.getInputStream();
         setUpStreamGobbler(inputStream, System.out);

         InputStream errorStream = process.getErrorStream();
         setUpStreamGobbler(errorStream, System.err);

         System.out.println("never returns");
         process.waitFor();
      } catch (IOException e) {
         throw new RuntimeException(e);
      } catch (InterruptedException e) {
         throw new RuntimeException(e);
      }
   }

   public static void setUpStreamGobbler(final InputStream is, final PrintStream ps) {
      final InputStreamReader streamReader = new InputStreamReader(is);
      new Thread(new Runnable() {
         public void run() {
            BufferedReader br = new BufferedReader(streamReader);
            String line = null;
            try {
               while ((line = br.readLine()) != null) {
                  ps.println("process stream: " + line);
               }
            } catch (IOException e) {
               e.printStackTrace();
            } finally {
               try {
                  br.close();
               } catch (IOException e) {
                  e.printStackTrace();
               }
            }
         }
      }).start();
   }
}


Answer 2:

编辑你/home/abhishek/workspace/Pro/run ,如果它是一个外壳,并添加顶部到下一行。

#!/usr/bin/bash

并提供所需的执行权限/home/abhishek/workspace/Pro/run

然后,使用下面的行

Process process = Runtime.getRuntime().exec("/home/abhishek/workspace/Pro/run");

现在,如果运行程序打印任何东西,你应该看到它的输出。



Answer 3:

您的代码看起来不错。 所以,我认为,问题是无论是在命令行中使用的是( bash /home/abhishek/workspace/Pro/run ),或在你的脚本本身。

我建议你执行以下步骤:

  1. 尝试运行一些知名的命令,而不是你的脚本。 例如pwd 。 检查你的代码是从输入流中读取正常工作。
  2. 现在尽量简化你的脚本。 创建脚本run1只运行相同的pwd 。 现在运行从Java这个脚本,看看它是否工作。 顺便说一句,你不必运行它bash yourscript 。 您可以直接运行它没有bash前缀
  3. 如果所有这些作品开始从简单的移动到你的真实脚本一步一步。 我相信,你会发现你的错误。 也许你的脚本无法启动,对于一些环境相关的问题。


Answer 4:

可能的问题是你获得inputStram时的子进程还没有准备好

尝试

Process process = Runtime.getRuntime().exec("bash /home/abhishek/workspace/Pro/run");
InputStream isout = process.getInputStream();    
process.waitFor()


Answer 5:

尝试是这样的:

String[] runCommand = new String[3];

runCommand[0] = "sh";
runCommand[1] = "-c";
runCommand[2] = "bash /home/abhishek/workspace/Pro/run";

Process process = runtime.exec(runCommand);
BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
String line = reader.readLine();
reader.close();


文章来源: Java Process cannot get the InputStream through Runtime.getRunTime().exec()