cp/rsync 是异步的吗?

cp/rsync 是异步的吗?

我们正在运行一个备份脚本,该脚本首先将文件复制到目的地,然后运行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之间放置一个命令,则不会出现警告,但我认为这不是一个很干净的解决方案。rsynccptar

一些事实:

  • 我尝试在和命令sync之间添加一个命令,结果相同。rsynctar
  • 根据@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并且,在阅读了一份质疑这样做的安全性的初步报告后,阅读更多论坛帖子证实了其安全性。

相关内容