Выполните ntpdate с Java и получите выходное значение

Я хочу выполнить эту команду в моей 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, обновленный в конце файла bash, я получу его в stdInput, но это все равно не означает, что время было обновлено

1 ответ

Вы, вероятно, обойдетесь проще, просто позвонив 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, вы иногда увидите, как процесс все еще работает, пока вы пытаетесь прочитать его ввод. Это может случиться почти каждый раз, на самом деле.

Другие вопросы по тегам