web-dev-qa-db-ja.com

ファイル変更時にrsyncをトリガーするにはどうすればよいですか?

rsync -avz /directory /targetとフォルダを同期できます。/directoryのファイルを変更した場合は、rsyncを自動的に呼び出す必要があります。

Virtual Boxを使用していますが、Virtual Boxの共有フォルダーは、特に共有フォルダーをドキュメントルートとして使用しているWebページがある場合、非常に遅くなります。 rsyncを使用すると、共有フォルダー上のローカルファイルを操作し、ドキュメントルートと自動的に同期できます。

誰かがそれを行う方法を知っていることを願っています、crontabは良くないでしょう、x分ごとに実行されるので、もし私が何もしなければ、rsyncを呼び出しますが、ファイルを変更しました。

宜しくお願いします

18
BlackScorp

crontabは良くありません、x秒/分ごとに実行されるため、何もしなければrsyncを呼び出しますが、ファイルを変更した場合はそうではありません

rsyncは、変更されたファイルのみを同期します。何も変更されていない場合、終了します。それは本当に最小限のオーバーヘッドです。

それに不満がある場合は、inotifywaitを使用できます。

while inotifywait -r /directory/*; do
    rsync -avz /directory /target
done

それはより迅速になりますが、物事を行いますevery時間を節約します。

18
Oli

Lsyncd(Live Syncing Daemon) を使用できます。

Lsyncdは、ローカルディレクトリツリーイベントモニターインターフェイス(inotifyまたはfsevents)を監視します。数秒間イベントを集約および結合し、1つ(または複数)のプロセスを生成して、変更を同期します。デフォルトでは、これはrsyncです。したがって、Lsyncdは軽量のライブミラーソリューションであり、新しいファイルシステムやブロックデバイスを必要とせず、比較的簡単にインストールでき、ローカルファイルシステムのパフォーマンスを妨げません。

たとえば、 buntu 16.04のチュートリアル です。

6
Arigion

inotifywaitおよびrsyncを使用できます。 inotifywaitイベントmodify,create,deleteが有効になっています。この方法では、ファイルが変更された場合にのみサーバーと同期します。そうでない場合は、ファイルが読み取られるたびに同期します(エディターはファイルを数回読み取って変更があるかどうかを確認します)。したがって、言った:

while inotifywait -r -e modify,create,delete /directory; do
    rsync -avz /directory /target
done
3
silgon

fswatch を使用して、変更されたファイルのscpをゲストにトリガーすることに成功しました。 Linuxでは、これはinotifyのラッパーですが、クロスプラットフォームでもあります(MacでArmベースのQEMUゲストを使用しています)。 sshリモートビルドも追加しました。プッシュアプ​​ローチは、理想的な方法とは異なる動作をする共有でうまく機能します。

0
Robin Macharg