
2 時間ごとにリモート バックアップを実行する rsync コマンドを実行する cron ジョブがあります。
以前のリモート バックアップがまだ実行中の場合に備えて、この rysnc コマンドを flock コマンド内にカプセル化しました。
Flock はこのコマンドが同時に複数回実行されるのを防ぎます:
flock -n /location/of/lock_file -c 'rsync -rv /home/localuser/ [email protected]:/home/remoteuser/backupFolder' || echo "Couldn't perform remote backup, because previous remote backup is still in progress."
ただし、これらのバックアップのいずれかの実行中にリモート サーバーを再起動すると (接続が切断されたシナリオをシミュレートするため)、以前のプロセス (バックアップ先から永続的に切断されているにもかかわらず) が存続するため、flock は将来の試行をブロックし続けます。
rsync が無期限に失敗していることを flock に知らせ、将来の試行の開始を妨げているこれらのロックを解除する最善の方法は何ですか?
rsync のマニュアル ページには、--timeout 引数があります。これを設定することが、flock の 24 時間ロックに対処する最善の方法でしょうか?
答え1
これはあなたの質問に対する答えではありませんflock
が、それでも役に立つかもしれません。しばらく前にバックアップ戦略に関する同様の質問がありましたが、私は気に入りました私の答え自分で実装するには十分です。
基本的な考え方は、バックアップ スクリプトが完了時にバックアップ先にファイルを作成し、実行を開始するとすぐにそのファイルを削除するというものです。次に、スクリプトでファイルの存在をテストし、ファイルが存在する場合にのみスクリプトを実行できるようにします。
#!/usr/bin/env bash
## Make sure no backup is currently running
if [ ! -e /path/to/backup/backup_finished.txt ]; then
echo "A backup seems to be running, or did not finish correctly, exiting." &&
exit;
fi
## Delete the file from the remote server
ssh user@remote rm /path/to/backup/backup_finished.txt
## Do da rsync
rsync /path/to/source/ user@remote:/path/to/daily/backup/
## Create the file on the remote server
ssh user@remote touch /path/to/backup/backup_finished.txt
これはあなたの方法よりもはるかに単純なアプローチですが、未完了のバックアップをキャッチできる(ただし、適切に処理できるわけではありません)という利点があります。これを拡張して、バックアップが実際に実行されているかどうか、または古いバックアップが正常に終了していないかどうかをテストし、それに応じて対応することができます。
ローカルマシンとリモートマシンの両方でプロセスを監視する必要があるため、ロックファイルのシステムは機能しないと思います。