在Ubuntu中,如果文件/A/largefile.foo通过'cp'或'mv'移动到/B/largefile.foo,如何在尝试移动文件之前确保写入整个文件到/C/largefile.foo的时间?
案例: 1.远程自动脚本X开始rsync到非常大的文件的目标文件夹A. 2.本地计算机上的cron作业每小时将文件从文件夹A移动到文件夹B,但我不想复制部分文件(我只想要完全上传的文件)
案例: 1.一个cron作业定期将文件从文件夹B移动到文件夹C,但我不想复制部分文件(我只想要完全上传的文件)
注意: 我正在寻找一种不需要添加pid文件的解决方案
答案 0 :(得分:4)
对于第一个rsync
案例,您可以使用--partial-dir
选项与--delay-updates
结合使用,它会将部分文件写入单独的位置,一旦完成就将其重命名为位置。
您应该确保部分目录与目标位于同一文件系统上,因此重命名将是原子的。
对于第二种情况,使用mv
(再次假定一个文件系统)将是原子的。
有关详细信息,请参阅rsync manual
答案 1 :(得分:1)
常见的方法是复制带有“.part”后缀的文件。复制完成后,脚本将重命名该文件以删除.part。您的其他脚本只需忽略.part文件。
这就是下载管理器,FTP程序等正在做的事情。
答案 2 :(得分:1)
使用rsync。您还可以md5sum原始文件和目标上的新文件(如果cp)
答案 3 :(得分:0)
在一个文件系统中,POSIX上的移动操作是原子操作。
如果您打开文件然后从文件系统中删除它,您仍然可以写入该文件。这就是我们在旋转日志之后需要告诉syslogd重新打开文件句柄的原因。
解决方案是首先写入临时文件,然后将其移动到目标。
rsync的选项--delay-updates
使其完成此操作。