2016-10-03 11 views
0

Я хочу выполнить эту команду в своей программе java и проверить, успешно ли она выполнена.Выполнить ntpdate с помощью java и получить значение вывода

sudo ntpdate -u someserver.com 

создать Баш с командой

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

и выполнить его с Явы

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 обновляется в конце файла Баш я получаю его в stdInput, но он все еще не означает, что время были обновлены

+0

Выполняется ли сценарий успешно в терминале? Вызывает ли пароль 'sudo' пароль? – starf

+0

да, он успешно выполнен и нет пароля – lisa

+0

У вас есть что-нибудь на stderr? Попробуйте изменить 'p.getInputStream()' на 'p.getErrorStream()'. Я попробовал аналогичный скрипт и не могу воспроизвести вашу проблему. – starf

ответ

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

 Смежные вопросы

  • Нет связанных вопросов^_^