我們正在運行一個備份腳本,它首先將檔案複製到目標,然後運行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 命令,警告沒有顯示,但我認為這是一個不太乾淨的解決方案。
對你有好處或有標準。如果您不使用睡眠,而是使用以下命令,會發生什麼情況:
須藤同步;迴聲 3 | sudo tee /proc/sys/vm/drop_caches
您認為這是一個好的解決方案嗎?
注意: /proc/sys/vm/drop_caches 似乎是 Ubuntu 使用的,並且預計不會是適用於所有 Unix 的方法(儘管可能是所有 Linux )。我讀完後提到它https://ubuntuforums.org/showthread.php?t=589975並且,在閱讀了質疑這樣做安全性的初步報告後,閱讀了更多確認其安全性的論壇貼文。