Linux: Menyinkronkan file secara terus-menerus, satu arah

61

Skenario: IDE diatur pada kotak desktop Linux, mengedit file PHP secara lokal. Setiap kali saya menyimpan file, saya ingin perubahan ini muncul di server linux tempat Apache berjalan. Server memiliki ssh (dan samba dan nfs dalam hal ini).

Sebagai referensi, ketika saya mengedit file pada Windows, saya akhirnya menemukan WinSCP sebagai alat yang tepat yang saya butuhkan - WinSCP baru saja menghadirkan fitur ini, dengan sinkronisasi awal dan kemudian pembaruan berkelanjutan, menggunakan layanan pengawasan sistem file: "Jaga Remote Directory tetap up to Tanggal".

Di Linux, orang dapat berargumentasi bahwa sshf dapat digunakan untuk menghindari kebutuhan sinkronisasi sepenuhnya. Di windows, berbagi samba akan melakukan hal yang sama. Namun, saya ingin IDE bekerja dengan file lokal (pada disk SSD!), Tidak harus melalui jaringan untuk melakukan pengindeksan PHP dan whatnots, yang membutuhkan waktu lama.

Namun sshf mungkin menjadi bagian dari solusi - sehingga sinkronisasi berkelanjutan hanya perlu dilakukan antara dua direktori lokal.

Ada ide atau petunjuk?

stolsvik
sumber
pertimbangkan untuk menggunakan alat rsync, atau berbagi folder di root dokumen server web sehingga Anda dapat beroperasi pada file langsung di bawah windows
Vinicius Kamakura
2
rsync adalah "one go". Saya perlu pembaruan terus-menerus, itulah intinya di sini - saya mengedit file, menyimpannya, dan produk / sistem / ide yang saya minta akan mengambil tindakan simpanan ini dan segera mengunggah versi baru. NB: Kedua belah pihak adalah Linux. NB2: Saya ingin mengedit file lokal, atau sshfs sendiri yang akan memotongnya.
stolsvik
6
Pemilih di luar topik, ini adalah kasus batas, tapi saya pikir itu jatuh cukup jelas di bawah "alat yang biasa digunakan oleh pemrogram" di FAQ.
Karl Bielefeldt
Meskipun ini bukan pertandingan yang sempurna, Anda mungkin melihat overlayfs
phs

Jawaban:

57

Anda juga dapat menggunakan inotifywaitdari paket inotify-tools.

inotifywait -r -m -e close_write --format '%w%f' /tmp | while read MODFILE
do
    echo need to rsync $MODFILE ...
done
Michał Šrajer
sumber
13
Di situs web inotify-tools , ada contoh yang cukup bagus menggunakan inotify-wait untuk memicu rsync.
Karl Bielefeldt
Saya mencari hal yang tepat tadi malam! ahhh Saya suka superuser
CenterOrbit
Apakah ada cara untuk melakukan ini tetapi tetap membuka soketnya? rsyncSaya scpmengalami penundaan yang menjengkelkan saat membuat koneksi ssh.
Flash
1
@Flash ya, Anda dapat menggunakan multiplexing SSH untuk menjaga soket tetap terbuka.
Will Angley
31

Lsyncd akan menjadi solusi yang bagus untuk ini.

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 live mirror yang ringan yang relatif mudah dipasang tanpa memerlukan sistem file baru atau perangkat blok dan tidak menghambat kinerja sistem file lokal.

Bottom-line, ia menggunakan jenis alat yang sama untuk melakukan pekerjaan (inotify dan rsync) seperti yang disarankan oleh jawaban lain, tetapi lebih mudah untuk mengatur seseorang yang tidak terbiasa dengan skrip shell.

Jcharaoui
sumber
tidak hanya lebih mudah, ia juga mencoba menangani situasi seperti memindahkan direktori dengan benar, tanpa rsyncing.
Ciantic
5
Hati-hati: Program ini memiliki beberapa fitur yang bermasalah. Pada saat penulisan ini: 1. Menghapus file jarak jauh tidak ada pada sumbernya per default. 2. "remote:" merujuk ke "remote: /" bukan folder home. 3. Memiemonisasi, jadi Anda tidak tahu apa yang sedang terjadi. 4. Ini tidak langsung menghormati sinyal TERM.
Friedrich
27

Saya sangat membutuhkan ini karena kode saya perlu dijalankan pada kotak jarak jauh dan saya menulis kode pada mesin lokal. Saya menemukan alat yang bagus yang dapat Anda gunakan untuk terus memonitor folder lokal Anda dan menyinkronkannya ke folder remote atau lokal: https://github.com/axkibe/lsyncd

Perintah sederhana untuk terus menyinkronkan dir lokal dengan mesin jarak jauh melalui ssh adalah:

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

Sama seperti perintah rsync lainnya, pastikan Anda memberikan path folder dengan benar dan periksa sebelum Anda menjalankan perintah. Saya hampir membunuh salah satu mesin jarak jauh saya karena saya ketinggalan untuk memberikan direktori tujuan yang benar. Pastikan Anda tidak ketinggalan jalur jauh dan jangan gunakan '/' kecuali Anda tahu apa yang Anda lakukan.

Harry
sumber
Ini layak mendapatkan lebih banyak upvotes, bahkan tiga tahun setelah diposkan
FliiFe
Bekerja dengan baik, akhirnya berhasil di Mac OS Sierra saya, bekerja dengan luar biasa.
Erik van de Ven
2

Jika Anda perlu mengamati filesystem, maka inotify adalah cara untuk melakukannya. Saya akan menulis skrip python sederhana menggunakan pyinotify untuk melakukan sinkronisasi ketika filesystem diubah. Lihat dokumentasi . Anda juga dapat memeriksa autosync.py untuk mendapatkan inspirasi. Selamat bersenang-senang.

Michał Šrajer
sumber
1

Apa yang saya lakukan sekali adalah memiliki skrip bash berjalan ls -ldalam satu lingkaran (dengan beberapa tidur) dan membandingkan dengan output sebelumnya. Jika berubah, lakukan sinkronisasi Anda.

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

Mulai skrip ini di terminal baru dengan nama file sebagai argumen (setelah memasukkan alat sinkronisasi Anda).

(Saya menggunakan ini untuk memulai kompilasi, bukan untuk menyinkronkan, tetapi ini akan bekerja dengan cara yang sama.)

Paŭlo Ebermann
sumber
-1

Pendekatan yang jauh lebih sederhana:

Ekspor / var / www Anda dengan samba (atau nfs) dan bekerja pada file langsung di server.

Solusi lain: sebagian besar IDE memungkinkan berbagai konfigurasi penempatan - periksa apakah ada yang cocok untuk Anda.

Atau atur sistem Manajemen Kode Sumber seperti Git, Bazaar, dll.

Semoga berhasil !!

Drago
sumber
3
Terimakasih telah menjawab. Namun, saya secara khusus mengecualikan pendekatan ini dalam pertanyaan.
stolsvik