2016-10-03 32 views
0

我想在我的java程序中执行这个命令并检查它是否成功执行。用java执行ntpdate并得到输出值

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结束时更新,但它仍然不意味着时间更新

+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-block,您偶尔会看到当您尝试读取其输入时该过程仍在运行。实际上,这几乎每次都可能发生。

相关问题