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

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

シナリオ: Linux デスクトップ ボックス上に IDE が設定され、PHP ファイルをローカルで編集しています。ファイルを保存するたびに、Apache が稼働している Linux サーバーにこの変更が表示されるようにしたいです。サーバーには ssh (さらに言えば、samba と nfs) があります。

参考までに、Windows でファイルを編集したとき、最終的に WinSCP がまさに必要なツールであることがわかりました。WinSCP には、ファイルシステム監視サービス「リモート ディレクトリを最新の状態に保つ」を使用して、初期同期とその後の継続的な更新を行うこの機能があります。

Linux では、sshfs を使用すれば同期の必要性を完全に回避できると主張する人もいるでしょう。Windows では、samba 共有で同じことができます。ただし、私は IDE がローカル ファイル (SSD ディスク上) で動作し、ネットワーク経由で PHP のインデックス作成などを行う必要がないようにしたいのです。ネットワーク経由だと時間のかかる作業です。

しかし、それでも sshfs は解決策の一部となる可能性があり、継続的な同期は 2 つのローカル ディレクトリ間でのみ実行する必要があります。

何かアイデアやアドバイスはありますか?

答え1

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

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

答え2

Lsyncdこれは良い解決策になるでしょう。

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

要するに、他の回答で提案されているのと同じ種類のツール (inotify と rsync) を使用して作業を実行しますが、シェル スクリプトに慣れていない人にとってはセットアップが簡単です。

答え3

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

ローカル ディレクトリを SSH 経由でリモート マシンと継続的に同期する簡単なコマンドは次のようになります。

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

他の rsync コマンドと同様に、コマンドを実行する前にフォルダー パスが正しく指定されていることを確認してください。正しい宛先ディレクトリを指定し忘れたために、リモート マシンの 1 つが壊れそうになりました。リモート パスを忘れないようにし、何をしているのかよくわからない場合は '/' を使用しないでください。

答え4

私が一度やったことは、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

新しいターミナルで、ファイル名を引数としてこのスクリプトを起動します (同期ツールを挿入した後)。

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

関連情報