1

我想使用 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。它现在运行成功。

4

3 回答 3

2

Runtime.exec如果您的命令失败,则不会抛出异常。

您可以使用process.exitValue().

您还可以从process.getInputStream()您在代码中创建但由于某种原因不读取的内容中读取脚本输出。echo在您的脚本中添加一些语句以进行调试。

于 2013-04-03T05:14:20.780 回答
2

您可以对代码进行很多改进。

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

像这样的东西:

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();
}
于 2013-04-03T05:17:50.100 回答
1

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

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

于 2013-04-03T05:14:31.187 回答