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