Bagaimana cara memicu rsync pada modifikasi file?

18

Saya dapat menyinkronkan folder dengan rsync -avz /directory /target, sekarang saya ingin melakukannya jika saya mengubah file /directorysehingga rsyncharus dipanggil secara otomatis.

Saya menggunakan Kotak Virtual dan folder bersama Kotak Virtual benar-benar lambat, terutama jika Anda memiliki halaman web yang menggunakan folder bersama sebagai root dokumen. Dengan rsyncsaya akan dapat bekerja dengan file lokal saya di folder bersama dan menyinkronkannya secara otomatis dengan root dokumen.

Saya harap seseorang memiliki ide bagaimana melakukannya, crontabtidak akan baik, karena dijalankan setiap x menit, jadi jika saya tidak melakukan apa-apa, itu masih akan memanggil rsynctetapi tidak jika saya memodifikasi file saya.

salam Hormat

BlackScorp
sumber

Jawaban:

18

crontab tidak akan bagus, karena dijalankan setiap x detik / menit, jadi jika saya tidak melakukan apa-apa, masih akan memanggil rsync tetapi tidak jika saya memodifikasi file saya

rsynchanya akan menyinkronkan file yang telah diubah. Jika tidak ada yang berubah, itu akan keluar. Itu benar-benar overhead yang minimal.

Jika Anda tidak puas dengan hal itu, Anda dapat menggunakan inotifywait:

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

Itu akan lebih instan tetapi akan melakukan hal-hal setiap kali Anda menghemat.

Oli
sumber
1
nampaknya masalah itu, bahwa inotify tidak dapat memeriksa folder nfs bersama. untuk memastikan, apa yang saya mau, coba jelaskan saya telah menginstal kotak virtual dengan gelandangan, di sana saya memiliki folder "proyek" bersama itu dipasang pada saat boot, semua file server web saya berada di sana sehingga saya dapat memodifikasinya di host saya sistem (win7) seperti yang saya katakan pada kotak bersama folder virtual benar-benar lambat, jadi solusinya bisa dengan menyinkronkan folder nfs yang terpasang ke tempat lain misalnya / var / www tetapi cara-cara umum tidak berfungsi, saya mencoba file yang diubah, icrontab, gues gamin atau fam akan membantu, tetapi saya tidak tahu bagaimana memulai atau menggunakannya
BlackScorp
@ BlackScorp realistis Anda terjebak hanya dengan cronning rsync dan membiarkannya memutuskan apa yang perlu disinkronkan. Seperti yang saya pimpin dalam jawaban, itu bukan pilihan yang buruk.
Oli
1
Opsi lainnya adalah mendorong file dari host daripada mencoba mendeteksi perubahan dari jarak jauh.
Oli
baik solusi ini saya gunakan sebelumnya, ia memiliki 2 masalah: 1) saya harus memeriksa kembali setiap kali ke kotak virtual saya untuk mengedit file, yang berarti, virtual saya harus berjalan, pengeditan cepat tidak berfungsi lagi 2) saya tidak tahu mengapa, tetapi karena dari proses pemindaian proyek samba IDE (Netbeans) saya menunjukkan 99% Penggunaan CPU dan segala sesuatu di dalam kotak virtual hanya lambat saat mengembangkan saya akan mencoba solusi rsyn + cronjob atau pembuatan php di server web
BlackScorp
The inotifywaitsolusi memiliki satu kelemahan sedikit tetapi penting: tidak mendeteksi perubahan yang terjadi ketika rsyncsedang berjalan. Pertimbangkan situasi berikut: file A diubah; rsync dipicu; ketika rsync hampir selesai menyinkronkan file A, file B diubah. Sekarang, rsyncselesai dan inotifywaitsedang berjalan, tetapi file B tidak disinkronkan dan tidak akan disinkronkan sampai beberapa perubahan berikutnya. Pertimbangkan untuk menggunakanlsyncd seperti yang disarankan oleh @Arigion.
MarSoft
6

Anda dapat menggunakan Lsyncd (Daemon Sinkronisasi Langsung) :

Lsyncd jam tangan antarmuka direktori acara pohon direktori lokal (inotify atau fsevents). Ini mengumpulkan dan menggabungkan acara selama beberapa detik dan kemudian memunculkan satu (atau lebih) proses untuk menyinkronkan perubahan. Secara default ini adalah rsync. Dengan demikian, Lsyncd adalah solusi cermin langsung berbobot ringan yang relatif mudah dipasang tanpa memerlukan sistem file baru atau memblokir perangkat dan tidak menghambat kinerja sistem file lokal.

Berikut adalah contohnya tutorial untuk Ubuntu 16.04 .

Arigion
sumber
2

Anda bisa menggunakan inotifywaitdan rsync. inotifywaitdengan acara modify,create,deletediaktifkan. Dengan cara ini Anda akan menyinkronkan dengan server Anda hanya ketika file berubah, jika tidak, file akan disinkronkan setiap kali file dibaca (editor membaca beberapa kali file Anda untuk memeriksa apakah ada perubahan). Demikian dikatakan:

while inotifywait -r -e modify,create,delete /directory; do
    rsync -avz /directory /target
done
silgon
sumber
Ini tidak akan mendeteksi perubahan yang terjadi saat rsync berjalan. Pertimbangkan untuk menggunakan lsyncdseperti yang disarankan oleh @Arigion.
MarSoft
ini akan menerapkan kembali semua peristiwa pada semua file setelah setiap perubahan ... dan ketika itu diterapkan itu tidak akan melihat perubahan dalam periode itu ...
Seseorang
0

Memperluas sedikit pada komentar untuk jawaban yang diterima Saya sudah sukses menggunakan fswatch untuk memicu scpperubahan file ke tamu. Di Linux ini adalah pembungkus inotifytetapi juga lintas platform (Saya menggunakan Mac dengan tamu QEMU berbasis lengan). Saya telah menempel pada sshbuild jarak jauh juga. Pendekatan push bekerja dengan baik dengan saham yang berperilaku kurang dari ideal.

Robin Macharg
sumber