我正在尝试使用 scp 将文件传输到远程 Unix 服务器。在该服务器上,有一个服务轮询目标目录以检测传入文件以进行处理。我想确保轮询服务在复制完成之前不会提取新文件。有没有办法做到这一点?
我的文件传输过程是一个嵌入在较大 Java 程序中的简单 scp 命令。理想情况下,不涉及更改 Jana 的解决方案将是最好的(出于涉及更改控制流程的原因)。
您可以将文件 scp 到不同的 (/tmp) 目录,并在传输完成后通过 ssh 移动文件。不同的目录需要与最终目标目录位于同一分区,否则将进行复制操作,您将面临类似的问题。目标机器上的另一个服务可以执行此移动操作。
您可以将文件复制为隐藏(文件名前缀为.
)并复制,然后移动
如果您可以修改轮询服务,则可以检查活动的 scp 进程并忽略匹配 scp 参数的文件。
lsof +d $directory
您可以在轮询服务器中检查打开的文件并忽略它们
rsync
我建议使用而不是复制文件scp
。 rsync
已经将新文件复制到临时文件名,并且还具有许多其他有用的文件同步功能。
$ rsync -a source/path/ remotehost:/target/path/
当然,如果您愿意,也可以逐个文件复制。
如果rsync
的临时文件名足以避免被轮询服务获取,那么您只需将scp
命令替换为充当 包装器的 shell 脚本rsync
,从而无需更改 Java 程序。
您需要知道 Java 程序用于调用scp
命令的精确格式,以确保您提供的选项rsync
符合您的预期。
您还需要弄清楚您的 Java 程序如何调用scp
. 如果它通过完整路径名 (ie /usr/bin/scp
) 这样做,那么此解决方案可能会使您的系统上依赖 scp 的其他事情处于危险之中(例如,您希望 scp 像通常那样而不是作为包装器来运行)。更改软件包安装的二进制文件/usr/bin/scp
也可能会“破坏”您的软件包注册,从而难以安装未来的安全更新,因为二进制文件已更改为 shell 脚本。当然,您所做的任何更改都可能存在安全隐患。
总而言之,我怀疑您最好更改您的 Java 程序以使其精确地执行您想要的操作,即使那是启动一个 shell 脚本来处理您希望将来能够更改的自动化方面,而无需修改你的 Java。
祝你好运!