ファイルシステムの変更を監視するBashスクリプト、バックアップスクリプトの実行前の遅延

ファイルシステムの変更を監視するBashスクリプト、バックアップスクリプトの実行前の遅延

ファイルの変更があるかどうかをディレクトリツリーを監視する必要があります。変更時にバックアップスクリプト(デフォルトではgitコミットですがデータベースダンプを含む)をトリガーしたいと思います。

比較的短時間でより多くの変更があると予想されるので、コミット数を減らすためにバックアップスクリプトを実行する前にn秒待つことを試みます。

私の要件を要約すると、次のようになります。

  • ディレクトリ内のファイルの変更を繰り返し監視する
  • バックアップを実行する前に追加の変更を実行できるn秒の猶予期間
  • バックアップの実行中に発生したすべての変更は失われてはいけません。

JavaScriptを使用してファイルを変更するときは、次の操作を行います。

if (timeout) {
  clearTimeout(timeout);
}
timeout = setTimeout(callback, 60000);

Bashスクリプトを使用してこの動作を複製する方法は不明です。私の現在のアプローチは次のとおりです。

watch.sh:

#!/bin/bash

inotifywait \
  --recursive \
  --monitor \
  --event attrib,modify,move,create,delete \
  --format %e \
  /usr/src/app/html/themes/ |

while read events; do
  flock -n /var/run/backup-watch.lockfile -c /usr/src/scripts/watch-backup.sh
done

watchbackup.sh:

#!/bin/bash

# wait for more changes to happen
sleep 60

# run script
/usr/src/scripts/commit-changes.sh

スタンバイ・コンポーネントがありますが、commit-changes.sh スクリプトの実行中に発生するすべての変更を無視します。

代替:

  • node jsスクリプトの使用を検討しましたが、node fs watchコマンドは再帰ディレクトリの監視を許可しないため、オプションではありません。
  • Cronが代わりになるかもしれませんが、計画通りに実行するのではなく、変更を確認する方が良いでしょう。 db-dump はバックアップスクリプトの一部であるため、バックアップスクリプトは毎回新しいコミットを生成します。他の変更があるかどうかを確認することでバックアップをより複雑にすることができますが、データベースダンプを使用してバックアップを単純に保ちたいと思います。

答え1

見て左同期

Lsyncdは、ローカルディレクトリツリーイベントモニタインタフェース(inotifyまたはfsevents)を監視します。数秒間イベントを集計して結合し、プロセスを作成して変更を同期します。

関連情報