0

Java プログラム内でこのコマンドを実行し、正常に実行されたかどうかを確認したいと考えています。

 sudo ntpdate -u someserver.com

コマンドでbashを作成します

#!/bin/sh
sudo ntpdate -u omeserver.com

Javaで実行します

ProcessBuilder pb = new ProcessBuilder("/updateTime");
    Process p = pb.start();     
    p.waitFor();             
    BufferedReader stdInput = new BufferedReader(new InputStreamReader(p.getInputStream()));
    System.out.println(stdInput.readLine());

しかし、出力がありませんstdInput。コマンドが正しく実行されたかどうかを確認するにはどうすればよいですか?

たとえば、Echo updated を bash ファイルの最後に追加すると、stdInput で取得されますが、それでも時刻が更新されたという意味ではありません

4

1 に答える 1

0

外部スクリプトの代わりにsudo直接呼び出すだけで、おそらく簡単に処理できるでしょう。ProcessBuilderこれは、当面のタスクにとって冗長な複雑さです。

ProcessBuilderたとえば、次のようにコマンド ライン全体を入力できます。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class q39836547 {
  private static String[] cmdl = { "/usr/bin/sudo",
                                   "ntpdate",
                                   "-u",
                                   "some.ntp.server" };
  public static void main(String[] as) throws IOException {
    ProcessBuilder pb = new ProcessBuilder(cmdl);
    Process p = pb.start();
    BufferedReader stdin = new BufferedReader(new InputStreamReader(p.getInputStream()));
    BufferedReader stderr = new BufferedReader(new InputStreamReader(p.getErrorStream()));

    try { p.waitFor(); }
    catch(InterruptedException e) { }

    if(p.exitValue() != 0)
      System.err.println("The process was not executed successfully.");
    else
      System.err.println("The process ran and exited cleanly.");

    stdin.lines().forEach(s -> System.out.println("STDOUT: " + s));
    stderr.lines().forEach(s -> System.out.println("STDERR: " + s));
  }
}

また、waitFor()(適切に行ったように) ntpdate を終了する必要があります。そうしないと、いずれかのストリームに出力が生成される前に、標準入力getInputStream()または標準エラーを読み取ってしまう可能性があります。getErrorStream()

try-catch-block をコメントアウトすると、入力を読み取ろうとしているときにプロセスがまだ実行されていることが時々わかります。実際、それはほぼ毎回発生する可能性があります。

于 2016-10-06T10:35:05.947 に答える