Linux: Dosyaları tek yönlü olarak sürekli senkronize et


61

Senaryo: Bir PHP masaüstü kutusunda, PHP dosyalarını yerel olarak düzenleyerek bir IDE kurulur. Bir dosyayı her kaydettiğimde, bu değişikliğin Apache'nin çalıştığı linux sunucusunda görünmesini istiyorum. Sunucunun ssh (ve bu konuda samba ve nfs) vardır.

Referans olarak, Windows’ta dosyaları düzenlediğimde nihayet WinSCP’yi ihtiyaç duyduğum tam araç olarak görmüştüm. Tarih, randevu, biriyle çıkmak".

Linux'ta, sshfs'in senkronizasyon ihtiyacını tamamen ortadan kaldırmak için kullanılabileceği öne sürülebilir. Pencerelerde samba paylaşımı da aynısını yapardı. Ancak, IDE'nin yerel dosyalarla (SSD diskinde!) Çalışmasını istiyorum, PHP üzerinden indeksleme yapmak için ağ üzerinden geçmek zorunda kalmayacağım ve yaşları süren ne olursa olsun.

Ancak sshfs yine de çözümün bir parçası olabilir - bu yüzden sürekli senkronizasyonun iki yerel dizin arasında yapılması gerekiyordu.

Herhangi bir fikir veya işaretçiler?


rsync aracını kullanmayı veya web sunucusunun belge kökünde bir klasörü paylaşmayı düşünün, böylece doğrudan pencerelerin altındaki dosyalarda çalışabilirsiniz
Vinicius Kamakura

2
rsync "bir adımdır". Sürekli güncellemelere ihtiyacım var, buradaki tek nokta bu - bir dosyayı düzenledim, sakladım ve istediğim ürün / sistem / fikir bu kaydetme işlemini seçip hemen yeni sürümü yükleyecekti. Not: Her iki taraf da Linux'tur. NB2: Yerel dosyaları düzenlemek istiyorum, yoksa sshfs'in kendisi onu keserdi.
stolsvik

6
Konu dışı seçmenler, bu bir sınır durumu, ancak SSS’de “programcılar tarafından yaygın olarak kullanılan araçlar” başlığı altında açıkça görüldüğünü düşünüyorum.
Karl Bielefeldt

Mükemmel bir eşleşme olmasa da, overlayfs'e bakabilirsiniz
phs

Yanıtlar:


57

Ayrıca inotifywaitinotify-tools paketinden de kullanabilirsiniz .

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

13
On Inotify-araçları web , bir rsync tetiklemek için Inotify-bekleme kullanmanın oldukça iyi bir örnek.
Karl Bielefeldt

Dün gece tam olarak bu şeyi arıyordum! ahhh superuser'ı seviyorum
CenterOrbit

Bunu yapmanın bir yolu var mı, ancak soketi açık tutun? rsync/ scpssh bağlantısını kurarken can sıkıcı bir gecikmeye sahiptir.
Flash

1
@Flash evet, soketi açık tutmak için SSH multiplexing kullanabilirsiniz .
Will Angley

31

Lsyncd bunun için iyi bir çözüm olacaktır.

Lsyncd, yerel bir dizin ağacı olayı izleyicisi arabirimini (inotify veya fsevents) izler. Olayları birkaç saniye bir araya getirir ve birleştirir ve ardından değişiklikleri senkronize etmek için bir (veya daha fazla) işlem (ler) başlatır. Varsayılan olarak bu rsync'dir. Lsyncd bu nedenle, yeni dosya sistemleri veya blok cihazlar gerektirmeyen ve yerel dosya sistemi performansını engellemeyen nispeten kolay kurulumlu hafif bir canlı ayna çözümüdür.

Alt satırda, diğer yanıtların önerdiği gibi işi yapmak için aynı tür araçları kullanır (inotify ve rsync), ancak kabuk komut yazmasına aşina olmayan biri için ayarlaması daha kolaydır.


Sadece kolay değil, aynı zamanda dizini düzgün bir şekilde taşımak yerine, dizini düzgün bir şekilde taşımayı dener.
Ciantic

5
Dikkat: Bu programın bazı problemli özellikleri var. Bunu yazarken: 1. Kaynakta bulunmayan uzaktaki dosyaları varsayılan başına siler. 2. "remote:", ev klasörü yerine "remote: /" anlamına gelir. 3. Bu daemonize olur, böylece neler olup bittiğini bilmiyorsunuz. 4. TERM sinyaline hemen uymamaktadır.
Friedrich

27

Kodumun uzak kutularda çalışması gerektiğinden ve yerel makineye kod yazdığım için buna çok ihtiyacım var. Yerel klasörlerinizi sürekli olarak izlemek ve uzak veya yerel klasörlerle senkronize etmek için kullanabileceğiniz hoş bir araç buldum: https://github.com/axkibe/lsyncd

Uzak bir makineyle yerel bir dizini ssh üzerinden sürekli senkronize etmek için basit bir komut:

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

Diğer rsync komutlarında olduğu gibi, klasör yolunu doğru verdiğinizden ve komutu çalıştırmadan önce kontrol ettiğinizden emin olun. Uzak makinemden birini neredeyse öldürüyordum çünkü doğru bir hedef dizini vermeyi özledim. Uzaktaki yolu kaçırmadığınızdan ve ne yaptığınızı bilmiyorsanız '/' kullanmayın.


Bu, gönderildikten üç yıl sonra bile çok daha fazla hak kazanmayı hak ediyor
FliiFe 21:16

Harika çalışıyor, nihayet Mac OS Sierra'da çalışıyor, harika çalışıyor.
Erik van de Ven,


1

Bir zamanlar yaptığım ls -lbir döngüde çalışan (biraz uyku ile) ve önceki çıktıyla karşılaştıran bir bash betiğine sahip olmak . Değişmişse, senkronizasyonunuzu yapın.

#!/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

Bu betiği dosya isimlerinin argüman olarak bulunduğu yeni bir terminalde başlatınız (senkronizasyon aracınızı yerleştirdikten sonra).

(Bunu bir derleme başlatmak için kullandım, senkronize etmek için değil, ancak benzer şekilde çalışacaktı.)


-1

Çok daha basit bir yaklaşım:

/ Var / www adresinizi samba (veya nfs) ile verin ve doğrudan sunucudaki dosyalar üzerinde çalışın.

Başka bir çözüm: çoğu IDE çeşitli dağıtım yapılandırmasına izin verir - size uygun olanın olup olmadığını kontrol edin.

Veya Git, Bazaar, vs. gibi bir Kaynak Kod Yönetim sistemi kurun.

İyi şanslar !!


3
Cevapladığınız için teşekkürler. Bununla birlikte, sorudaki bu yaklaşımı özellikle dışladım.
stolsvik
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.