我们正在运行一个备份脚本,该脚本首先将文件复制到目的地,然后运行tar
它。
DIR2BCK='/foo/bar'
TMPDIR=$(mktemp -d)
rsync -a ${DIR2BCK} ${TMPDIR}/ > /dev/null 2>&1
tar czf /tmp/foo.backup.tar ${TMPDIR}
运行最后一条命令后,有时会显示以下警告:
/tmp/tmp.blqspkA136:我们读取时文件已发生改变
我们将目标复制到临时目录,以避免在压缩时更改文件。使用命令cp
而不是时,此行为也可以重现rsync
。我一直认为这些命令是同步的,但这个警告似乎表明了相反的情况。
如果我在/和行sleep
之间放置一个命令,则不会出现警告,但我认为这不是一个很干净的解决方案。rsync
cp
tar
一些事实:
- 我尝试在和命令
sync
之间添加一个命令,结果相同。rsync
tar
根据@jcbermu的建议,我也尝试更改脚本,因此两行如下:
rsync -a ${DIR2BCK} ${TMPDIR}/ > /dev/null 2>&1 & wait
我运行该脚本几次,其中一些显示出相同的行为,声称文件在复制时发生了变化。
${TMPDIR}
和使用的文件系统都是 EXT4${DIR2BCK}
。${DIR2BCK}
在远程文件系统上,实际上这是远程机器的 Samba 挂载点。${TMPDIR}
在本地文件系统上。但是,更改${DIR2BCK}
为本地文件系统没有任何区别。- 所有文件系统均基于硬件 RAID-5。
这些命令实际上是同步的吗?如果不是,有没有办法让它们同步,或者有替代命令?
答案1
一个解决方案是将其重写为:
rsync -a ${DIR2BCK} ${TMPDIR}/ > /dev/null 2>&1 ; tar czf foo.backup.tar ${TMPDIR}
所以,不到最后tar
不会开始rsync
。
另一个解决方案是将cp
/发送rsync
到后台并等待,直到它以命令结束wait
。
例如:
rsync -a ${DIR2BCK} ${TMPDIR}/ > /dev/null 2>&1 &
wait
tar czf foo.backup.tar ${TMPDIR}
&
该行的最后rsync
一行将执行发送到后台(它变为孩子当前会话),然后强制wait
此 shell 会话等待,直到所有子会话都完成后才能继续。
答案2
我在 rsync/cp 和 tar 行之间放置了一个 sleep 命令,警告没有出现,但我认为这不是一个很干净的解决方案。
对你来说很好,或者有标准。如果你不使用 sleep,而是使用:
sudo sync; echo 3 | sudo tee /proc/sys/vm/drop_caches
您认为这是一个好的解决方案吗?
注意:/proc/sys/vm/drop_caches 似乎是 Ubuntu 使用的,预计不会成为适用于所有 Unix(尽管可能适用于所有 Linux)的方法。我在阅读后提到了这一点https://ubuntuforums.org/showthread.php?t=589975并且,在阅读了一份质疑这样做的安全性的初步报告后,阅读更多论坛帖子证实了其安全性。