Linux:一方向でファイルを継続的に同期する


61

シナリオ:IDEはLinuxデスクトップボックスにセットアップされ、PHPファイルをローカルで編集します。ファイルを保存するたびに、Apacheが実行されているLinuxサーバーにこの変更を表示したいと思います。サーバーにはssh(およびそのためのsambaとnfs)があります。

参考として、Windowsでファイルを編集したときに、最終的に必要なツールとしてWinSCPを見つけました。WinSCPは、ファイルシステム監視サービスを使用して、最初の同期と継続的な更新を行うこの機能のみを提供します。日付"。

Linuxでは、同期の必要性を完全に回避するためにsshfsを使用できると主張できます。Windowsでは、samba-shareでも同じことができます。ただし、IDEでローカルファイル(SSDディスク上!)を処理し、PHPのインデックス作成やその他の処理を行うためにネットワークを経由する必要はありません。

ただし、sshfsはソリューションの一部である可能性があります。そのため、2つのローカルディレクトリ間で継続的な同期を行う必要がありました。

アイデアや指針はありますか?


rsyncツールの使用を検討するか、Webサーバーのドキュメントルート内のフォルダーを共有して、ウィンドウの下で直接ファイルを操作できるようにすることを検討してください
Vinicius Kamakura

2
rsyncは「ワンゴー」です。継続的な更新が必要です。これが全体のポイントです。ファイルを編集して保存すると、要求した製品/システム/アイデアがこの保存アクションを選択し、すぐに新しいバージョンをアップロードします。NB:両方ともLinuxです。NB2:ローカルファイルを編集したい、またはsshfs自体がそれをカットしたい。
-stolsvik

6
トピック外の有権者、これは境界ケースですが、FAQの「プログラマーがよく使用するツール」にかなり明確に該当すると思います。
カールビーレフェルト

完全に一致しているわけではありませんが、overlayfs
phs

回答:


57

inotifywaitinotify-toolsパッケージからも使用できます。

inotifywait -r -m -e close_write --format '%w%f' /tmp | while read MODFILE
do
    echo need to rsync $MODFILE ...
done

13
のinotify-toolsのウェブサイト、rsyncのをトリガするためのinotify-待機を使用してのかなり良い例があります。
カールビーレフェルト

私は昨夜この正確なものを探していました!
ああ、

これを行う方法はありますが、ソケットを開いたままにしますか?rsync/ scpssh接続の確立中に迷惑な遅延が発生します。
フラッシュ

1
@Flashはい、SSH多重化を使用してソケットを開いたままにすることができます。
ウィル・アンギュリー

31

Lsyncdはこのための良い解決策でしょう。

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

要するに、他の回答で示唆されているのと同じ種類のツール(inotifyとrsync)を使用しますが、シェルスクリプトに精通していない人でも簡単にセットアップできます。


簡単であるだけでなく、ディレクトリを適切に移動するなどの状況をrsyncなしで処理しようとします。
シアンティック

5
注意:このプログラムには、いくつかの問題のある機能があります。これを書いている時点で:1.デフォルトでソースに存在しないリモートファイルを削除します。2.「remote:」は、ホームフォルダーではなく「remote:/」を指します。3.デーモン化されるため、何が起こっているのかわかりません。4. TERMシグナルをすぐに尊重しません。
フリードリヒ

27

私のコードはリモートボックスで実行する必要があり、ローカルマシンでコードを書くため、これが非常に必要です。ローカルフォルダーを継続的に監視し、リモートまたはローカルフォルダーに同期するために使用できる便利なツールを見つけました:https : //github.com/axkibe/lsyncd

sshを介してローカルdirをリモートマシンと継続的に同期する簡単なコマンドは次のとおりです。

lsyncd -log all -nodaemon -rsyncssh <local_path> <user>@<ip> <remote_path>

他のrsyncコマンドと同様に、コマンドを実行する前に、フォルダーパスを正しく指定し、確認してください。正しい宛先ディレクトリを指定するのを逃したため、リモートマシンの1つをほとんど殺していました。あなたが何をしているのかわからない限り、リモートパスを見逃さないようにし、「/」を使用しないでください。


これは、投稿されてから3年後であっても、より多くの賛成に値する
-FliiFe

Mac OS Sierraで動作するようになりました。
エリック


1

私が一度やったのは、bashスクリプトをls -lループで実行し(スリープ状態)、前の出力と比較することです。変更された場合は、同期を行います。

#!/bin/bash

listcommand="ls -l $*"

newfilelist=$( $listcommand )
while true
do
   if [[ $oldfilelist != $newfilelist ]]
   then
      oldfilelist=$newfilelist
      # run your synchronization tool
   fi
   sleep 10 || exit 2 
   newfilelist=$( $listcommand )
done

引数としてファイル名を使用して、新しい端末でこのスクリプトを開始します(同期ツールを配置した後)。

(同期するためではなく、コンパイルを開始するためにこれを使用しましたが、これは同様の方法で機能します。)


-1

より簡単なアプローチ:

/ var / wwwをsamba(またはnfs)でエクスポートし、サーバー上のファイルを直接操作します。

別の解決策:ほとんどのIDEでは、さまざまな展開構成が可能です-自分に合ったものがあるかどうかを確認してください。

または、Git、Bazaarなどのソースコード管理システムを設定します。

幸運を !!


3
回答ありがとうございます。ただし、質問ではこのアプローチを特に除外しました。
stolsvik
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.