Linux: ซิงโครไนซ์ไฟล์อย่างต่อเนื่องทางเดียว


61

สถานการณ์จำลอง: IDE ถูกตั้งค่าบนกล่องเดสก์ท็อป Linux ซึ่งแก้ไขไฟล์ PHP แบบโลคัล ทุกครั้งที่ฉันบันทึกไฟล์ฉันต้องการให้การเปลี่ยนแปลงนี้ปรากฏบนเซิร์ฟเวอร์ linux ที่ Apache กำลังทำงานอยู่ เซิร์ฟเวอร์มี ssh (และ samba และ nfs สำหรับเรื่องนั้น)

ตามการอ้างอิงเมื่อฉันแก้ไขไฟล์บน Windows ในที่สุดฉันก็มา WinSCP เป็นเครื่องมือที่แน่นอนที่ฉันต้องการ - WinSCP มีเพียงคุณลักษณะนี้ในปัจจุบันด้วยการซิงค์ครั้งแรกและจากนั้นอัปเดตอย่างต่อเนื่องโดยใช้บริการเฝ้าดูระบบแฟ้ม: "Keep Remote Directory up to วันที่"

บนลีนุกซ์เราสามารถยืนยันได้ว่า sshfs นั้นสามารถใช้เพื่อหลีกเลี่ยงความต้องการการซิงโครไนซ์ทั้งหมด บน windows การแบ่งปันแซมบ้าจะทำเช่นเดียวกัน อย่างไรก็ตามฉันต้องการให้ IDE ทำงานกับไฟล์โลคัล (บนดิสก์ SSD!) โดยไม่ต้องผ่านเครือข่ายเพื่อทำดัชนี PHP และ whatnots ซึ่งใช้เวลานาน

แต่ sshfs อาจเป็นส่วนหนึ่งของการแก้ปัญหาอย่างไรก็ตามเพื่อให้การซิงโครไนซ์ต่อเนื่องจำเป็นต้องทำระหว่างสองโลคัลไดเร็กทอรี

ความคิดหรือพอยน์เตอร์ใด ๆ


ลองใช้เครื่องมือ rsync หรือแชร์โฟลเดอร์ในรูทเอกสารของเว็บเซิร์ฟเวอร์เพื่อให้คุณสามารถทำงานกับไฟล์ได้โดยตรงภายใต้ windows
Vinicius Kamakura

2
rsync คือ "one go" ฉันต้องการการอัปเดตอย่างต่อเนื่องนั่นคือประเด็นทั้งหมดที่นี่ - ฉันแก้ไขไฟล์บันทึกและผลิตภัณฑ์ / ระบบ / ความคิดที่ฉันร้องขอจะเลือกบันทึกการกระทำนี้และอัปโหลดเวอร์ชันใหม่ทันที หมายเหตุ: ทั้งสองฝ่ายเป็น Linux NB2: ฉันต้องการแก้ไขไฟล์ในเครื่องมิฉะนั้น sshfs จะตัดทิ้ง
stolsvik

6
ผู้มีสิทธิเลือกตั้งนอกหัวข้อนี้เป็นกรณีขอบเขต แต่ฉันคิดว่ามันค่อนข้างชัดเจนภายใต้ "เครื่องมือที่ใช้กันทั่วไปโดยโปรแกรมเมอร์" ในคำถามที่พบบ่อย
Karl Bielefeldt

แม้ว่ามันจะไม่ใช่การจับคู่ที่สมบูรณ์แบบ แต่คุณอาจดูโอเวอร์เลย์
phs

คำตอบ:


57

คุณยังสามารถใช้inotifywaitจากแพ็คเกจ inotify-tools

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

13
บนเว็บไซต์inotify-toolsมีตัวอย่างที่ดีของการใช้ inotify-wait เพื่อทริกเกอร์ rsync
Karl Bielefeldt

เมื่อคืนนี้ฉันกำลังมองหาสิ่งที่แน่นอน! อ่าฉันรัก superuser
CenterOrbit

มีวิธีการทำเช่นนี้ แต่ให้เปิดซ็อกเก็ต? rsync/ scpมีความล่าช้าที่น่ารำคาญในขณะที่ทำการเชื่อมต่อ ssh
แฟลช

1
@ แฟลชใช่คุณสามารถใช้มัลติเพล็กซิ่งSSHเพื่อเปิดซ็อกเก็ต
Will Angley

31

Lsyncdจะเป็นทางออกที่ดีสำหรับสิ่งนี้

Lsyncd จะเฝ้าดูอินเตอร์เฟสการมอนิเตอร์เหตุการณ์ทรีของไดเร็กทอรีโลคัล (inotify หรือ fsevents) จะรวมและรวมเหตุการณ์เป็นเวลาสองสามวินาทีจากนั้นจะวางกระบวนการหนึ่ง (หรือมากกว่า) กระบวนการ (es) เพื่อซิงโครไนซ์การเปลี่ยนแปลง โดยค่าเริ่มต้นนี่คือ rsync Lsyncd จึงเป็นโซลูชันมิเรอร์ไลฟ์ที่มีน้ำหนักเบาซึ่งค่อนข้างง่ายต่อการติดตั้งโดยไม่ต้องใช้ระบบไฟล์ใหม่หรือบล็อคอุปกรณ์และไม่ขัดขวางประสิทธิภาพของระบบไฟล์โลคัล

บรรทัดล่างใช้เครื่องมือชนิดเดียวกันในการทำงาน (inotify และ rsync) ตามคำแนะนำของคำตอบอื่น ๆ แต่มันง่ายกว่าที่จะตั้งค่าสำหรับคนที่ไม่คุ้นเคยกับเชลล์สคริปต์


ไม่เพียง แต่ง่ายขึ้นเท่านั้น แต่ยังพยายามจัดการกับสถานการณ์เช่นการย้ายไดเรกทอรีอย่างถูกต้องโดยไม่ต้องซิงค์
Ciantic

5
ระวัง: โปรแกรมนี้มีคุณสมบัติที่เป็นปัญหา ในการเขียนสิ่งนี้: 1. มันจะลบไฟล์ระยะไกลที่ไม่ปรากฏที่แหล่งที่มาตามค่าเริ่มต้น 2. "remote:" หมายถึง "remote: /" แทนที่จะเป็นโฟลเดอร์โฮม 3. เป็นสิ่งที่ทำให้คุณไม่ทราบว่าเกิดอะไรขึ้น 4. ไม่เคารพสัญญาณ TERM ในทันที
ฟรีดริช

27

ฉันต้องการสิ่งนี้มากเนื่องจากรหัสของฉันจำเป็นต้องทำงานบนกล่องระยะไกลและฉันเขียนรหัสบนเครื่องท้องถิ่น ฉันพบเครื่องมือที่ดีที่คุณสามารถใช้เพื่อตรวจสอบโฟลเดอร์ในเครื่องของคุณอย่างต่อเนื่องและซิงค์ไปยังโฟลเดอร์ระยะไกลหรือท้องถิ่น: https://github.com/axkibe/lsyncd

คำสั่งง่าย ๆ ในการซิงค์ dir ท้องถิ่นกับเครื่องระยะไกลผ่าน ssh อย่างต่อเนื่องจะเป็น:

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

เช่นเดียวกับคำสั่ง rsync อื่น ๆ ตรวจสอบให้แน่ใจว่าคุณกำหนดเส้นทางโฟลเดอร์ให้ถูกต้องและตรวจสอบก่อนที่จะเรียกใช้คำสั่ง ฉันเกือบจะฆ่าหนึ่งในเครื่องระยะไกลของฉันเพราะฉันพลาดที่จะให้ไดเรกทอรีปลายทางที่ถูกต้อง ตรวจสอบให้แน่ใจว่าคุณจะไม่พลาดเส้นทางระยะไกลและอย่าใช้ '/' เว้นแต่คุณจะรู้ว่าคุณกำลังทำอะไรอยู่


สิ่งนี้สมควรได้รับการ
โหวต

ใช้งานได้ดีในที่สุดก็ทำงานบน Mac OS Sierra ของฉันใช้งานได้ยอดเยี่ยม
Erik van de Ven

2

หากคุณจำเป็นต้องสังเกตระบบไฟล์แล้ว inotify ก็เป็นวิธีที่จะทำ ฉันจะเขียนสคริปต์ python อย่างง่ายโดยใช้pyinotifyเพื่อทำการซิงค์เมื่อระบบไฟล์เปลี่ยนแปลง ดูเอกสาร คุณอาจชำระเงินautosync.pyเพื่อหาแรงบันดาลใจ มีความสุข.


1

สิ่งที่ฉันทำครั้งเดียวก็คือมีสคริปต์ทุบตีทำงานls -lในวง (ด้วยการนอนหลับ) และเปรียบเทียบกับผลลัพธ์ก่อนหน้า หากมีการเปลี่ยนแปลงทำข้อมูลให้ตรงกันของคุณ

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

วิธีการง่าย ๆ อีกมากมาย:

ส่งออก / var / www ของคุณด้วย samba (หรือ nfs) และทำงานกับไฟล์บนเซิร์ฟเวอร์โดยตรง

โซลูชันอื่น: IDE ส่วนใหญ่อนุญาตการกำหนดค่าการปรับใช้ที่หลากหลาย - ตรวจสอบว่ามีสิ่งที่เหมาะสมกับคุณหรือไม่

หรือตั้งค่าระบบการจัดการซอร์สโค้ดเช่น Git, Bazaar เป็นต้น

โชคดี !!


3
ขอบคุณสำหรับคำตอบ. อย่างไรก็ตามฉันได้ยกเว้นวิธีนี้ในคำถามโดยเฉพาะ
stolsvik
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.