外部スクリプトの代わりに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 をコメントアウトすると、入力を読み取ろうとしているときにプロセスがまだ実行されていることが時々わかります。実際、それはほぼ毎回発生する可能性があります。