2011-12-07 121 views
1

您能帮我解决这个问题吗?差异 - 通过java执行unix命令并通过提示即正常执行

我有一个Java代码,它使用运行时对象运行rsync命令。

我在源机器上运行下面的代码,如果在目标机器同步过程中有任何rsync连接问题,代码应该会收到退出值,但现在不会发生。

String rsyncCommand = "rsync –abv <source> <remoteAddr:dest>" 
Runtime rt = Runtime.getRuntime(); 
rt.exec(rsyncCommand); 

给你更多的细节:

当我直接运行rsync命令(不通过java代码)在源机器和使用kill -9同步过程中的选择,如果我杀了在目标机器rsync的过程,源中的rsync进程将退出并退出消息。

但是,如果我通过我的java代码运行rsync,并且如果在目标同步过程中杀死进程,它将不会收到任何退出消息。 java和rsync进程仍处于运行模式。但没有做任何任务。

通过java直接通过命令提示符运行命令有什么不同?

任何人都有与rsync类似的问题,我们有任何其他选项来通过Java运行rsync,我也尝试过“ProcessBuilder”。

请给我提供一些解决此问题的指针。


感谢您的回应,我只给出了示例代码,下面是我在java中使用的完整代码。

Runtime rt = Runtime.getRuntime(); 
    Process proc = null; 
    try { 
    proc = rt.exec(rsyncCommand); 
    InputStream stderr = proc.getErrorStream(); 
    InputStreamReader isrErr = new InputStreamReader(stderr); 
    BufferedReader brErr = new BufferedReader(isrErr); 

InputStream stdout = proc.getInputStream(); 
InputStreamReader isrStd = new InputStreamReader(stdout); 
BufferedReader brStd = new BufferedReader(isrStd); 

String val = null; 
while ((val = brStd.readLine()) != null) { 
    System.out.println(val); 
} 

while ((val = brErr.readLine()) != null) { 
    System.out.println(val); 
} 
int exitVal = proc.waitFor(); 
} catch (Exception e) { 
e.printStackTrace(); 

}

回答

1

你EXEC的调用()不正确,就应该直接指定参数,是这样的:

Runtime rt = Runtime.getRuntime(); 
rt.exec(new String[]{"rsync", "-abv", "<source>", "<remoteAddr:dest>"}); 

执行不会做命令行的任何分析,所以它试图执行一个名为“rsync -abv”的命令(作为单个字符串)

+0

假设源和remoteAddr和dest输入参数,他可能要放弃功能任何';'你可以做这样的事情:dest =“8080; rm -rf /“ – Woot4Moo

2

如果你这样做并且进程还没有完成,你将不会收到退出值

Process process = rt.exec(rsyncCommand); 
int exitValue = process.exitValue(); 

,而不是你应该使用

int exitValue = process.waitFor() 

然后该线程将等到返回退出值

+1

好点,我已经更新了我的答案,并且为'waitFor()'抛出的'InterruptedException'添加了处理。 – Asaph