差异 - 通过java执行unix命令并通过提示即正常执行

时间:2011-12-07 15:42:14

标签: java unix rsync

您能否帮我解决这个问题。

我有一个使用Runtime对象运行rsync命令的Java代码。

我在源计算机上运行以下代码,如果在目标计算机上同步期间存在任何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();

}

2 个答案:

答案 0 :(得分:2)

如果您这样做并且该过程尚未完成,则您将不会收到退出值

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

相反,你应该使用

int exitValue = process.waitFor()

然后线程将一直等到进程返回退出值

答案 1 :(得分:1)

你的exec()调用不正确,它应该直接指定参数,如:

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

exec不对命令行进行任何解析,因此它试图执行一个名为“rsync -abv”的命令(作为单个字符串)