1

在 Ubuntu 中,如果文件 /A/largefile.foo 通过 'cp' 或 'mv' 移动到 /B/largefile.foo,我如何确保在第二次尝试将文件移动到 / 之前写入整个文件C/大文件.foo?

案例: 1. 远程自动化脚本 X 开始 rsync 到一个非常大文件的目标文件夹 A。2.本地机器上的cron作业每小时将文件从文件夹A移动到文件夹B,但我不想复制部分文件(我只想要完全上传完成的文件)

案例: 1. 一个cron作业定期将文件从文件夹B移动到文件夹C,但我不想复制部分文件(我只想要完全上传完成的文件)

注意:我正在寻找不需要添加pid文件的解决方案

4

4 回答 4

4

对于第一种rsync情况,您可以使用与--partial-dir结合的选项--delay-updates,它将部分文件写入单独的位置,完成后将它们重命名到位。

您应该确保部分目录与目标位于同一文件系统上,因此重命名将是原子的。

对于第二种情况,使用mv(再次假设一个文件系统)将是原子的。

有关更多信息,请参阅rsync 手册

于 2010-08-09T14:07:32.077 回答
1

一种常见的方法是复制带有“.part”后缀的文件。复制完成后,脚本会重命名文件以删除 .part。您的其他脚本只需忽略 .part 文件。

这就是下载管理器、FTP 程序等正在做的事情。

于 2010-08-09T13:58:59.650 回答
1

使用 rsync。您还可以 md5sum 原始文件和目标上的新文件(如果是 cp)

于 2010-08-11T19:49:10.877 回答
0

移动操作在一个文件系统内的 POSIX 上是原子的。

如果您打开一个文件,然后将其从文件系统中删除,您仍然可以写入该文件。这就是为什么我们需要在轮换日志后告诉 syslogd 重新打开文件句柄。

解决方案是先写入临时文件,然后将其移动到目的地。rsync 的选项--delay-updates可以做到这一点。

于 2010-08-11T03:29:48.303 回答