2

我正在尝试使用 scp 将文件传输到远程 Unix 服务器。在该服务器上,有一个服务轮询目标目录以检测传入文件以进行处理。我想确保轮询服务在复制完成之前不会提取新文件。有没有办法做到这一点?

我的文件传输过程是一个嵌入在较大 Java 程序中的简单 scp 命令。理想情况下,涉及更改 Jana 的解决方案将是最好的(出于涉及更改控制流程的原因)。

4

2 回答 2

2
  • 您可以将文件 scp 到不同的 (/tmp) 目录,并在传输完成后通过 ssh 移动文件。不同的目录需要与最终目标目录位于同一分区,否则将进行复制操作,您将面临类似的问题。目标机器上的另一个服务可以执行此移动操作。

  • 您可以将文件复制为隐藏(文件名前缀为.)并复制,然后移动

  • 如果您可以修改轮询服务,则可以检查活动的 scp 进程并忽略匹配 scp 参数的文件。

  • lsof +d $directory您可以在轮询服务器中检查打开的文件并忽略它们

于 2012-07-30T15:59:48.850 回答
2

rsync我建议使用而不是复制文件scprsync已经将新文件复制到临时文件名,并且还具有许多其他有用的文件同步功能。

$ 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。

祝你好运!

于 2012-07-31T03:19:36.230 回答