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 命令,警告沒有顯示,但我認為這是一個不太乾淨的解決方案。

對你有好處或有標準。如果您不使用睡眠,而是使用以下命令,會發生什麼情況:

須藤同步;迴聲 3 | sudo tee /proc/sys/vm/drop_caches

您認為這是一個好的解決方案嗎?

注意: /proc/sys/vm/drop_caches 似乎是 Ubuntu 使用的,並且預計不會是適用於所有 Unix 的方法(儘管可能是所有 Linux )。我讀完後提到它https://ubuntuforums.org/showthread.php?t=589975並且,在閱讀了質疑這樣做安全性的初步報告後,閱讀了更多確認其安全性的論壇貼文。

相關內容