【问题标题】:Execute ntpdate with java and get the output value用java执行ntpdate,得到输出值
【发布时间】:2016-10-03 16:49:05
【问题描述】:

我想在我的 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 中得到它,但这并不意味着时间已更新

【问题讨论】:

  • 脚本是否在终端中成功执行? sudo 是否提示输入密码?
  • 是的,它执行成功,不需要密码
  • 你有什么关于stderr的吗?尝试将p.getInputStream() 更改为p.getErrorStream()。我尝试了类似的脚本,但无法重现您的问题。

标签: java bash processbuilder ntpd


【解决方案1】:

直接使用ProcessBuilder 而不是外部脚本调用sudo 可能会更轻松。这只是手头任务的冗余复杂性。

你可以用整个命令行输入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,您有时会在尝试读取其输入时看到该进程仍在运行。实际上,这几乎每次都会发生。

【讨论】:

    猜你喜欢
    • 2019-04-07
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 2013-10-01
    相关资源
    最近更新 更多