Dosya değişikliğinde rsync'i nasıl tetiklerim?


18

Klasörleri ile senkronize edebilirim rsync -avz /directory /target, şimdi bir dosyayı değiştirirsem bunu yapmak istiyorum, /directorybu yüzden rsyncotomatik olarak çağrılmalıdır.

Virtual Box kullanıyorum ve Virtual Box'ın paylaşılan klasörü, özellikle paylaşılan klasörü belge kökü olarak kullanan bir web sayfanız varsa, gerçekten yavaştır. İle rsyncpaylaşılan klasördeki yerel dosyalarımla çalışabilir ve belge kökü ile otomatik olarak senkronize edebilirim.

Umarım birisi nasıl yapılacağına dair bir fikre sahiptir, crontabiyi olmaz, çünkü her x dakikada bir yürütülür, bu yüzden bir şey yapmazsam, yine de arayacak rsyncancak dosyamı değiştirirsem değil.

Saygılarımla

Yanıtlar:


18

crontab iyi olmaz, çünkü her x saniye / dakika yürütülür, bu yüzden bir şey yapmazsam, yine de rsync'i çağırır, ancak dosyamı değiştirirsem değil

rsyncyalnızca değiştirilen dosyaları senkronize eder. Hiçbir şey değişmediyse, çıkacaktır. Bu gerçekten asgari bir yük.

Bundan memnun değilseniz inotifywait:

while inotifywait -r /directory/*; do
    rsync -avz /directory /target
done

Bu daha anlık olacak ama her kaydettiğinizde bir şeyler yapacak .


1
iyi görünüyor ki, inotify paylaşılan nfs klasörlerini kontrol edemiyor. emin olmak için, ne istiyorum, ben vagrant ile yüklü sanal kutusu var anlatmaya çalışıyorum, orada bir paylaşılan klasör "projeler" var önyükleme monte, tüm web sunucusu dosyaları orada bulunur, bu yüzden onları benim ev sahibi değiştirebilirsiniz sistem (win7) dediğim gibi sanal kutu paylaşılan klasörler gerçekten yavaş, bu yüzden çözüm monte nfs klasörü başka bir yerde örneğin / var / www senkronize etmek olabilir ama ortak yollar çalışmıyor, ben dosyaları değişti, icrontab, gues gamin veya fam yardımcı olur, ancak nasıl başlatılacağını veya kullanılacağını bilmiyorum
BlackScorp

@BlackScorp gerçekçi olarak sadece rsync'i taklit etmekle ve neyin senkronize edilmesi gerektiğine karar vermesine izin veriyorsunuz. Cevapta önderlik ettiğim için bu çok kötü bir seçenek değil.
Oli

1
Diğer seçenek, değişiklikleri uzaktan algılamaya çalışmak yerine dosyaları ana bilgisayardan iletmektir.
Oli

daha önce kullandığım bu çözüm, 2 problemi var: 1) dosyaları düzenlemek için her zaman sanal kutuma yeniden bağlamak zorunda kaldım, bu da benim sanal çalışmam gerekiyor, hızlı düzenleme artık çalışmıyor 2) neden bilmiyorum, çünkü IDE (Netbeans) samba proje tarama sürecinin% 99 CPU Kullanımı gösterir ve sanal kutu içindeki her şey sadece yavaş yavaş geliştirirken ben rsyn + cronjob çözüm veya web sunucusunda php inşa
deneyeceğim

inotifywaitÇözelti bir küçük ama önemli bir dezavantajı var: ne oldu değişiklikleri algılamaz rsyncçalışıyor. Aşağıdaki durumu göz önünde bulundurun: A dosyası değiştirilir; rsync tetiklenir; rsync dosyası A senkronizasyonu neredeyse tamamlandığında B dosyası değiştirilir. Şimdi rsyncbitti ve inotifywaitçalışıyor, ancak B dosyası senkronize edilmedi ve bir sonraki değişikliğe kadar senkronize edilmeyecek. @Arigion tarafından önerilen şekilde kullanmayı düşününlsyncd .
MarSoft

6

Sen kullanabilirsiniz Lsyncd (Canlı Eşzamanlama Daemon) :

Lsyncd, yerel dizin ağaçları olay izleme arabirimini (inotify veya fsevents) izler. Olayları birkaç saniyeliğine toplar ve birleştirir ve ardından değişiklikleri senkronize etmek için bir (veya daha fazla) işlemi oluşturur. Varsayılan olarak bu rsync'dir. Bu nedenle Lsyncd, yeni dosya sistemleri gerektirmeyen veya aygıtları engellemeyen ve yerel dosya sistemi performansını engellemeyen nispeten kolay kurulabilen hafif bir canlı ayna çözümüdür.

İşte Ubuntu 16.04 için bir eğitim .


2

Sen kullanabilirsiniz inotifywaitve rsync. inotifywaitetkinlik modify,create,deleteetkinken. Bu şekilde sunucunuzla yalnızca dosya değiştiğinde senkronize edilirsiniz, aksi takdirde bir dosya okunduğunda senkronize edilir (editörler herhangi bir değişiklik olup olmadığını kontrol etmek için dosyanızın birkaç kez okur). Böylece şöyle dedi:

while inotifywait -r -e modify,create,delete /directory; do
    rsync -avz /directory /target
done

Bu, rsync çalışırken meydana gelen değişiklikleri algılamaz. lsyncd@Arigion tarafından önerilen şekilde kullanmayı düşünün .
MarSoft

bu, her değişiklikten sonra tüm dosyalardaki tüm etkinlikleri yeniden uygular ... ve uygulandığında o dönemde herhangi bir değişiklik görmez ...
Birisi

0

Kabul edilen cevaba yapılan bir yorumda biraz genişleyen konuklara değiştirilen dosyaların tetiklenmesi için fswatch kullanarak başarılı oldum scp. Linux'ta bu bir paketleyici inotifyama aynı zamanda çapraz platform (Kol tabanlı bir QEMU misafiriyle Mac'teyim). Ben de sshuzak bir yapıya takıldım . İtme yaklaşımı, ideal yollardan daha az davranan paylaşımlarla iyi çalışır.

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.