ssh – Linux.ファイルを継続的に同期させる、一方通行

linux scp ssh winscp

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

参考までに、私がWindowsでファイルを編集したとき、私は最終的に私が必要としていたツールとしてWinSCPの上に来ました – WinSCPは、ファイルシステムウォッチサービスを使用して、初期同期とその後の継続的な更新で、ちょうどこの機能を持っています。”リモートディレクトリを最新の状態に保つ”

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

しかし、sshfs はそれにもかかわらず解決策の一部であるかもしれません

何かアイデアやポイントはありますか?

  68  None  2011-08-01


ベストアンサー

inotify-toolsパッケージのinotifywaitを使うこともできます

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

61  Michał Šrajer  2011-08-01


Lsyncdはこれを解決するのに良いでしょう

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

結論から言うと、他の回答で提案されているように、仕事をするために同じ種類のツール(inotifyとrsync)を使いますが、シェルスクリプトに慣れていない人にとっては設定が簡単です

34  jcharaoui  2013-05-14


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

ローカルディレクトリとリモートマシンをssh上で連続的に同期させる簡単なコマンドは以下のようになります

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

他の rsync コマンドと同じように、フォルダパスを正しく与えて、コマンドを実行する前に確認してください。私はほとんどの場合、正しい保存先ディレクトリを指定し損ねたためにリモートマシンの一つを殺してしまいました。リモートパスを見落とさないようにして、何をしているかわからない限り ‘/’ を使わないようにしてください

32  harry  2013-11-28


ファイルシステムを監視する必要がある場合は、inotifyがそれを行う方法です。私はpyinotifyを使ってシンプルなpythonスクリプトを書き、ファイルシステムが変更されたときに同期を行うようにします。ドキュメントを参照してください。また、autosync.pyをチェックしてみてください。楽しんでください

2  Michał Šrajer  2011-08-01


私が一度やったことは、ls -lをループで実行しているbashスクリプトを(いくつかのスリープをかけて)前回の出力と比較することです。変わっていたら同期をしてください

#!/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  2011-08-01


もう一つの選択肢。https://github.com/mikkorantalainen/rsync-continuous

このスクリプトは bash, inotifywait, rsyncssh の上に使用して、非常に高速な一方通行同期を作成します

mkdir -p ~/.ssh/connectionsを実行し、~/.ssh/configの先頭に次のように追加すれば、パフォーマンスはかなり向上します

ControlMaster auto
ControlPath   ~/.ssh/connections/%r@%h:%p
ControlPersist 1

上記の設定では、https://bugzilla.mindrot.org/show_bug.cgi?id=3220 のバグにより ssh 接続を終了するたびに余分な出力が発生することに注意してください

上記のスクリプトを使用してリモートホストにオープンなssh接続を維持している場合、ファイルは約100ミリ秒の遅延で同期されるはずです

0  Mikko Rantalainen  2020-10-09


はるかにシンプルなアプローチ

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

もう一つの解決策: ほとんどの IDE は様々なデプロイメント設定を可能にしており、自分に合ったものがあるかどうかを確認してください

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

頑張れ!

-1  Dragos  2011-08-02


タイトルとURLをコピーしました