web-dev-qa-db-ja.com

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

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

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

Linuxでは、sshfsを使用して同期の必要性を完全に回避できると主張することができます。 Windowsでは、samba共有でも同じことができます。ただし、IDEでローカルファイル(SSDディスク上の!)を操作できるようにしたいので、ネットワーク経由でPHPインデックスを作成する必要はありません。 、これには年齢がかかります。

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

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

65
stolsvik

Inotify-toolsパッケージのinotifywaitを使用することもできます。

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

Lsyncd はこのための良い解決策です。

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

結論としては、他の回答で提案されているのと同じ種類のツール(inotifyとrsync)を使用してジョブを実行しますが、シェルスクリプトに慣れていない人のために設定する方が簡単です。

32
jcharaoui

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

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

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

他のrsyncコマンドと同様に、コマンドを実行する前に、フォルダーパスを正しく指定し、確認してください。正しい宛先ディレクトリを指定できなかったため、リモートマシンの1つを強制終了しようとしていました。リモートパスを見逃さないようにしてください。また、何をしているかわからない場合は、「/」を使用しないでください。

29
harry

ファイルシステムを監視する必要がある場合は、inotifyがその方法です。簡単なpythonスクリプトを pyinotify を使用して記述し、ファイルシステムが変更されたときに同期を実行します。 documentation を参照してください。また、- autosync.py インスピレーションを得るために。

2
Michał Šrajer

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