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


18

でフォルダを同期できるrsync -avz /directory /targetようになりました。ファイルを変更した場合、自動的に呼び出される/directoryようにrsyncなりました。

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

crontabx分ごとに実行されるため、誰かがそれを行う方法を知っていて、良くないだろうことを願っていrsyncます。

宜しくお願いします

回答:


18

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

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

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

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

それはより迅速になりますが、保存するたびに動作します。


1
問題は、inotifyが共有nfsフォルダーをチェックできないということです。確認するために、私が望んでいることを説明しようとすると、vagrantで仮想ボックスがインストールされており、起動時にマウントされる共有フォルダ「プロジェクト」があり、すべてのウェブサーバーファイルがそこにあるのでホストで変更できますsystem(win7)私が仮想ボックス共有フォルダは本当に遅いと言ったので、解決策はマウントされたnfsフォルダを別の場所、たとえば/ var / wwwに同期することですが、一般的な方法は機能しません、fileschanged、icrontab、gues gaminまたはfamは役立ちますが、それらを起動または使用する方法が
わかりません-BlackScorp

@BlackScorpは現実的には、rsyncのクローンを作成し、同期が必要なものを決定させるだけで行き詰まっています。私が答えで導いたように、それはひどい悪いオプションではありません。
オリ

1
他のオプションは、変更をリモートで検出しようとするのではなく、ホストからファイルをプッシュすることです。
オリ

以前に使用したこのソリューションには、2つの問題があります:1)ファイルを編集するために仮想ボックスに毎回再調整する必要がありました、つまり、仮想が実行されている必要があり、クイック編集はもう機能していません2)理由はわかりませんが、仮想ボックス内の私のIDE(Netbeansの)サンバショー99%のCPU使用率と、すべてのプロジェクトのスキャンプロセスの開発中に、私がWebサーバにrsyn + cronジョブ液やPHPのビルドをしようとするだけ遅いです
BlackScorp

このinotifywaitソリューションには、わずかですが重要な欠点が1つrsyncあります。実行中に発生した変更を検出しません。次の状況を考慮してください。ファイルAが変更されました。rsyncがトリガーされます。rsyncがファイルAの同期をほぼ完了すると、ファイルBが変更されます。これで、rsync終了しinotifywaitて実行されますが、ファイルBは同期されず、次の変更まで同期されません。@Arigionの提案に従って使用lsyncdすることを検討しください
MarSoft

6

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

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

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


2

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

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

これは、rsyncの実行中に発生した変更を検出しません。lsyncd@Arigionの提案に従って使用することを検討してください。
MarSoft

これは、各変更の後、すべてのファイルのすべてのイベントを再適用されます...そしてそれが適用だときは、その期間の変更...表示されません
誰かを

0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.