我正在通过我的java应用程序运行rsync。(Solaris Evn)
Java应用程序将使文件与远程计算机同步。在我们的连接失败测试期间,我们注意到通过java程序运行rsync的问题。如果在同步过程中出现任何连接问题,则在源端运行的Java应用程序不会收到任何错误消息。
有关测试方案的简要信息:
ps -ef | grep rsync
以检查进程是否正在运行(源和目标)。两个端rsync进程都在运行。kill -9 <pid>
并且还注意到rsync进程仍然在源端运行,并且rsync进程也没有在日志文件中打印任何日志消息。
注意:如果我们直接运行rsync命令(而不是通过java程序),那么一切正常。当我们在目标处停止rsync进程时,源进程将停止。
当RSYNC终止于目标时,Java程序和RSYNC未检测到目标有问题。没有写入日志文件,Java程序将挂起并变得无响应。
通过 perl 工作正常。不确定java有什么问题...... !!!
我没有任何线索来调试此问题。 请分享您的想法和指向调试的指针。
答案 0 :(得分:1)
在Java端,我建议创建两个额外的线程来使用Process p的p.getInputStream()和p.getErrorStream()流。我认为这有助于rsync
感受到更多的爱和关心。
这样的事情(我为了简单而忽略了IOExceptions--你将不得不处理它们!):
final Process p = Runtime.exec("rsync"); // however you do this...
Runnable consumeIn = new Runnable() {
public void run() {
InputStream in = p.getInputStream();
InputStreamReader isr = new InputStreamReader(in, "UTF-8");
BufferedReader br = new BufferedReader(isr);
String line;
while ( (line = br.readLine()) != null ) {
// Throw away the data? Or do something with it if you like!
}
}
};
Runnable consumeErr = new Runnable() {
public void run() {
InputStream in = p.getErrorStream();
// etc... (very similar to consumeIn)
}
};
new Thread(consumeIn).start();
new Thread(consumeErr).start();