java - Unix Copy & JSch 命令在 SFTP 时产生冲突

标签 java sftp race-condition jsch

我有一个场景,首先我需要将文件从源复制到目标 1,然后将相同的文件从源移动到目标 2 目录。

所有这三个文件夹(Source、Destination1 和 Destination2)均位于远程服务器中。因此,为了实现相同的目的,我使用 JSch API 来建立 SFTP 连接。

由于 JSch 不提供任何远程复制任何文件的方法,因此我使用 Unix cp 命令来实现相同的目的。但是有重命名命令可以移动文件。

问题是,当我运行时,程序文件没有被复制,但移动成功。原因似乎是 Unix 复制命令需要时间来执行该操作,但在执行移动命令之前。由于我使用 Unix 的 cp 命令,Java 不会等待(像 Fire and Forget 一样)完成复制命令。

为了确认我对这个问题的理解,我在复制命令之后放置了 sleep() 并且文件正在成功复制和移动。但这不是一个好的设计。

有人可以帮我解决同样的问题吗?有什么方法可以让java程序等待Unix cp命令成功执行。

下面是复制文件的代码片段:

String command1= "cp "+BackUpQueue+"/"+trimmedString+" "+HUBQueue+"/"+trimmedString ; 
channel1=session.openChannel("exec");
((ChannelExec)channel1).setCommand(command1);
channel1.setInputStream(null);
((ChannelExec)channel1).setErrStream(System.err);
InputStream in=channel1.getInputStream();
channel1.connect();
in.close();

移动文件的代码:

channelSftp.rename(SFTPWORKINGDIR+"/"+trimmedString, BackUpQueue+"/"+trimmedString);

最佳答案

您必须等待“exec” channel 完成/关闭,然后才能在“sftp” channel 上安全地运行重命名

具体实现请参见 Sending commands to server via JSch shell channel .

关于java - Unix Copy & JSch 命令在 SFTP 时产生冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26916128/

相关文章:

java - Android getParentFragment() 在 fragment 内的 ViewPager 中返回 null

php - 使用sftp上传文件时如何修复PHP curl错误CURLE_SSH(79)

c# - C# worker 线程唤醒竞争条件

c++ - 为什么在极少数情况下 pthread_exit() 在 pthread_detach() 之后调用时会导致 SEGV?

java - -1 左移 31

java - 错误 : Cannot load this JVM TI agent twice starting Oracle WebLogic Server 12. 1.3.0

java - Linux 上的 JSCH 抛出 java.awt.HeadlessException

go - 使用 -race 标志时 GO 中的竞争条件是什么意思

java - 使用 PrintWriter 和 if 语句追加与覆盖

amazon-web-services - 我应该将我的 Spring Boot REST API jar 文件放在我的 Ubuntu EC2 实例上的什么位置?