您能否帮我解决这个问题。
我有一个使用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();
}
答案 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”的命令(作为单个字符串)