Runtime.exec没有运行但没有异常

时间:2013-04-03 05:05:40

标签: java runtime exec

我想用java在某个位置运行脚本。如果我手动运行脚本运行正常:

     /export/home/trace.sh param1 param2 param3 param4

这是我从java运行脚本的代码:

     try {

      Runtime runtime = Runtime.getRuntime();
      Process proc = null;
      System.out.println("starting search");
      proc = runtime.exec( pathServer + "/trace.sh " + fullDate + " " + fullDateTo + " " + mA.substring(2) + " " + mB.substring(2));
      InputStream inputstream           =   proc.getInputStream();
      InputStreamReader inputstreamreader   =   new InputStreamReader(inputstream);
      BufferedReader bufferedreader         =   new BufferedReader(inputstreamreader);
      System.out.println("end search " + System.currentTimeMillis());
      }
     catch (Exception e)
      {
         System.out.println(e.toString());
         e.printStackTrace();
      }

如果脚本正在运行,它将在指定位置生成“txt.dat”。但是没有生成“txt.dat”。我试图找出异常是什么,但没有异常捕获。

我的代码是否正确?我如何知道它是否正在处理脚本?如何捕获过程中发生的任何异常?感谢。


更新2

我添加了一些代码来打印getInputStreamgetErrorStream。 对于getInputStream,我什么都没有,这意味着它是空的。 对于getErrorStream,我得到了这个结果

         Host key verification failed

我仍然不知道这个错误意味着什么。

java应用程序在服务器B中运行。

通常,我尝试调用的脚本(在服务器B中)将ssh到服务器A并在服务器A中运行其他脚本。它将生成text.dat然后sftp到服务器B.当手动运行时,txt .dat已成功生成并转移到服务器B。


更新3

感谢所有帮助和建议。事实证明,我的Java应用程序在不同的用户下运行。当我手动运行它时,我使用了另一个用户。所以,我已经将服务器B的主机密钥添加到服务器A.现在它已成功运行。

3 个答案:

答案 0 :(得分:2)

如果你的命令失败,

Runtime.exec不会抛出异常。

您可以使用process.exitValue()获得执行结果。

此外,您可以从代码中创建的process.getInputStream()读取脚本输出,但由于某些原因不能读取。在脚本中放入一些echo语句进行调试。

答案 1 :(得分:2)

您可以对代码进行一些改进。

  1. 使用ProcessBuilder创建流程,而不是Runtime。它为您提供更多选择和更好的控制
  2. 将命令的每个组件作为单独的字符串传递给构建器
  3. 完全消耗输出和错误流
  4. 等待该过程实际完成
  5. 这样的事情:

    try {
        ProcessBuilder builder = new ProcessBuilder()
                .command("/export/home/trace.sh", param1, param2, param3, param4);
        builder.redirectErrorStream(true);
    
        System.out.println("starting search");
        Process proc = builder.start();
        final BufferedReader bufferedreader = new BufferedReader(
                new InputStreamReader(proc.getInputStream()));
        new Thread() {
            @Override
            public void run() {
    
                try {
                    String line = null;
                    StringBuffer buffer = new StringBuffer(2048);
                    while ((line = bufferedreader.readLine()) != null) {
                        buffer.append(line);
                    }
                } catch (final IOException ioe) {
                    ioe.printStackTrace();
                }
                // Do something with process output, if needed
            }
        }.start();
    
        proc.waitFor();
        System.out.println("end search " + System.currentTimeMillis());
    } catch (Exception e) {
        e.printStackTrace();
    }
    

答案 2 :(得分:1)

您可以调试或打印Process.getErrorStreamProcess.getInputStream,以检查子流程报告的错误。

我的猜测是你需要调用/bin/sh作为主程序并将你的脚本作为参数传递,但我不确定。我知道你必须在Windows上这样做。