2016-10-03 2 views
0

私のJavaプログラム内でこのコマンドを実行し、正常に実行されたかどうかを確認します。javaでntpdateを実行し、出力値を取得

sudo ntpdate -u someserver.com 

は、私はどのように確認することができ、stdInputには行が存在しない、コマンド

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

ではbashを作成し、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でそれを得るbashのファイルの最後に更新たとえばエコーのために追加しますが、それはまだ時間が更新されたことを意味するものではありません場合は、単にあなたがおそらくより簡単で取得したい

+0

スクリプトは端末で正常に実行されますか? 'sudo'はパスワードの入力を促しますか? – starf

+0

はい正常に実行され、パスワードは必要ありません – lisa

+0

stderrには何かがありますか? 'p.getInputStream()'を 'p.getErrorStream()'に変更してみてください。私は似たようなスクリプトを試しましたが、あなたの問題を再現することはできません。 – starf

答えて

0

sudoを直接外部スクリプトの代わりにProcessBuilderと呼んでください。それは、手元の作業にとって冗長な複雑さです。

あなたはこのように、例えば、コマンドライン全体でProcessBuilderを養うことができます(あなたが適切に行ったように)あなたはまたwaitFor()に終了するにntpdateを持って

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)); 
    } 
} 

。そうでなければ、いずれかのストリームに出力が生成される前に標準入力または標準エラーをgetInputStream()またはgetErrorStream()と読み終えることになります。

try-catch-blockをコメントアウトすると、入力を読み込もうとしている間にプロセスがまだ実行中であることが時々分かります。実際には、ほとんど毎回発生する可能性が高いです。

関連する問題