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

印刷するコードをいくつか追加しgetInputStreamますgetErrorStream。についてgetInputStreamは、何も得られませんでした。つまり、null です。の場合getErrorStream、結果としてこれが得られます

         Host key verification failed

このエラーの意味はまだわかりません。

Java アプリはサーバー B で実行されます。

通常、(サーバー B で) 呼び出しようとしているスクリプトは、サーバー A に ssh し、サーバー A で他のスクリプトを実行します。text.dat を生成し、次にサーバー B に sftp します。手動で実行すると、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.getErrorStreamandをデバッグまたは印刷しProcess.getInputStreamて、サブプロセスによって報告されたエラーを確認できます。

私の推測では/bin/sh、メイン プログラムとして呼び出し、スクリプトを引数として渡す必要があると思いますが、よくわかりません。Windowsでそれをしなければならないことは知っています。

于 2013-04-03T05:14:31.187 に答える