我想在我的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
中没有行,如何检查命令是否正确执行?
如果我添加例如在bash文件末尾更新的Echo,我会在stdInput中添加它,但它仍然不意味着时间已更新
答案 0 :(得分: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,那么当您尝试阅读其输入时,您偶尔会看到该过程如何仍在运行。实际上,这几乎每次都可能发生。