最初にファイルを保存先にコピーし、その後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 の提案に従って、スクリプトを次の 2 行に変更してみました。
rsync -a ${DIR2BCK} ${TMPDIR}/ > /dev/null 2>&1 & wait
スクリプトを数回実行しましたが、そのうちのいくつかは同じ動作を示し、コピー時にファイルが変更されたことを示しました。
使用されるファイルシステムは、
${TMPDIR}
との両方で EXT4 です${DIR2BCK}
。${DIR2BCK}
はリモートファイルシステム上にあります。実際は、これはリモートマシンの Samba マウントポイントです。${TMPDIR}
はローカルファイルシステム上にあります。ただし、${DIR2BCK}
ローカルファイルシステムに変更しても違いはありません。- すべてのファイルシステムはハードウェア RAID-5 ベースです。
これらのコマンドは実際に同期していますか? そうでない場合、同期させる方法、または代替コマンドはありますか?
答え1
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
すべての子プロセスが終了するまでこのシェル セッションを待機させて続行します。
答え2
rsync/cp と tar の行の間に 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そして、これを実行することの安全性を疑問視する最初のレポートを読んだ後、安全性を確認するフォーラムのスレッド投稿をさらに読みました。