最近、Ubuntu Serverを搭載したマシンをセットアップして、ゲームサーバーをホストします。マシンの特定のフォルダにゲームワールドファイルの頻繁なバックアップを作成する各ゲームサーバーのバックアッププラグインをインストールしました。また、cron
タスクを設定して、rsyncで-a
オプションを使用して、これらのバックアップをDropboxフォルダーに毎晩自動的にコピーしました。
数か月後、Dropboxアカウントがストレージの上限に達し、あまり多くのバックアップを保持できないことに気づいたので、あまり多くのバックアップを保持しないようにゲームサーバーのバックアッププラグインを構成し、数日待って毎週実行するようにスケジュールされている古いバックアップを削除します。バックアッププラグインは最終的にそのジョブを実行し、古いバックアップを削除したので、rsync
cronタスクがその後、Dropboxフォルダーから古いバックアップを削除してソースフォルダーと一致することを期待していましたが、そうしませんでした。質問がいくつかあります。
デフォルトでは、rsync
のみaddソースフォルダーに追加された宛先フォルダーへのファイルとchangeソースフォルダー内で変更されたファイルNOT deleteソースフォルダーから削除されたファイル?
その場合、rsync
にこれを実行させる最良の方法は何ですか?移行先フォルダーに移行元フォルダーを完全に反映させたいので、移行元フォルダーから削除されたファイルをすべて削除する必要があります。
rsync
のマニュアルページに、トリックを行う可能性のあるいくつかのオプションが表示されていますが、私はよく知らないので。
ターゲットのファイルを削除するには、--delete
オプションをコマンドに追加します。例えば:
rsync -avh source/ dest/ --delete
rsyncコマンドは、そのコマンドでオプションdelete
を使用している間、ファイルを削除しません。そのため、ソースにファイルまたはフォルダーが追加された場合、削除せずにターゲットに同期されます。
ソースファイルからバックアップを作成するにはrsync
を使用し、一定期間またはファイルのサイズのファイルを削除するにはfind ... rm
を使用することをお勧めします。
rsync [options] SOURCE TARGET
find TARGET -maxdepth 1 -type f -mtime +60 -exec rm -f {} \;
上記のコードブロックは、ソースからバックアップを作成し、最終変更時刻が2か月を超えるすべてのファイルを削除します。
UPDATE
delete
オプションはTARGET専用であり、一部のファイルがソースから削除された場合、rsync --delete
はTARGETからそれらを削除します。 delete
およびafter
によるbefore
オプションは、マニュアルページで説明されています。
--delete-before receiver deletes before transfer, not during
という意味です:
--delete-after receiver deletes after transfer, not during
という意味です:
NOTE:--delete-{before/after}
はTARGETだけで実装します。
このコマンドは、増分データをコピーし、リモートサーバーとの同期を維持します。
rsync -avWe ssh --delete-before (source) root@localhost:(destination) rsync -avW --delete-before -e ssh (source) root@localhost:(destination)
例:
rsync -avWe ssh --delete-before /data [email protected]:/backup
rsync -avW --delete-before -e ssh /data [email protected]:/backup
Rsync scync中にエラーが発生した場合、--delete
、--delete-after
、または--delete-before
を使用した場合でも、rsyncは必要なファイルを適切に削除しません。
これが、rsyncエラーに対処することが重要である理由です。
私のエラーのほとんどは、Linux以外のファイルシステムとの同期中に--perm
オプションを使用したことが原因でした。 --perms
を--no-perms
に置き換えると、これらのエラーはなくなり、削除は機能しました。
--perms
は、Linuxファイルシステムから別のLinuxファイルシステムに同期する場合は問題ありませんが、Linuxから非Linuxファイルシステム(NTFS、FATなど)に同期する場合は、--perms
rsyncは非LinuxファイルシステムにLinuxパーミッションを設定できないためエラーが発生します。繰り返しますが、エラー=削除はありません。
-Linux以外のパーティションに同期するとき、--no-perms
を使用して、妨害行為--delete
、--delete-after
、または--delete-before
のエラーを回避します。
それでもエラーが発生し、それらのエラーを解決する方法がわからない場合は、非同期ファイルの削除専用のコマンドを実行できます。
Sudo rsync -r --delete --existing --ignore-existing --ignore-errors --progress /path/to/source/ /path/to/destination
上記のコマンドは、同期していないものを削除しますが、ファイルを同期しません。そのため、この後に再度同期する必要があります。このコマンドは、この answer に基づいていますが、--ignore-errors
引数も追加したため、エラーがあった場合でも削除されます。