ฉันจะทริกเกอร์ rsync ในการแก้ไขไฟล์ได้อย่างไร


18

ฉันสามารถซิงค์โฟลเดอร์ด้วยrsync -avz /directory /targetตอนนี้ฉันต้องการที่จะทำถ้าฉันเปลี่ยนไฟล์ใน/directoryดังนั้นrsyncควรจะเรียกโดยอัตโนมัติ

ฉันใช้ Virtual Box และโฟลเดอร์ที่ใช้ร่วมกันของ Virtual Box นั้นช้ามากโดยเฉพาะถ้าคุณมีหน้าเว็บที่ใช้โฟลเดอร์ที่ใช้ร่วมกันเป็น root ของเอกสาร ด้วยrsyncฉันจะสามารถทำงานกับไฟล์ในเครื่องของฉันในโฟลเดอร์ที่แชร์และซิงค์โดยอัตโนมัติด้วยรูทเอกสาร

ฉันหวังว่าบางคนมีความคิดว่าจะทำเช่นนั้นได้อย่างไรcrontabจะไม่ดีเพราะมันจะถูกดำเนินการทุก ๆ x นาทีดังนั้นถ้าฉันไม่ทำอะไรเลยมันจะยังคงโทรออกrsyncแต่ไม่ใช่ถ้าฉันแก้ไขไฟล์ของฉัน

ขอแสดงความนับถืออย่างสูง

คำตอบ:


18

crontab จะไม่ดีเพราะมันถูกประมวลผลทุกๆ x วินาที / นาทีดังนั้นถ้าฉันไม่ทำอะไรเลยมันจะยังคงเรียก rsync แต่ถ้าฉันแก้ไขไฟล์ของฉัน

rsyncจะซิงค์เฉพาะไฟล์ที่มีการเปลี่ยนแปลงเท่านั้น หากไม่มีอะไรเปลี่ยนแปลงมันจะออก นั่นเป็นค่าใช้จ่ายที่น้อยมาก

หากคุณไม่พอใจกับสิ่งที่คุณสามารถใช้inotifywait:

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

นั่นจะเป็นทันทีมากขึ้น แต่จะทำทุกสิ่งที่คุณประหยัด


1
ปัญหาดูเหมือนว่า inotify ที่ไม่สามารถตรวจสอบโฟลเดอร์ nfs ที่ใช้ร่วมกัน เพื่อให้แน่ใจว่าสิ่งที่ฉันต้องการลองเพื่ออธิบายว่าฉันมีกล่องเสมือนติดตั้งกับคนจรจัดฉันมีโฟลเดอร์ที่ใช้ร่วมกัน "โครงการ" มันติดตั้งอยู่ในการบูตไฟล์เว็บเซิร์ฟเวอร์ทั้งหมดของฉันอยู่ที่นั่นเพื่อให้ฉันสามารถแก้ไขพวกเขาบนโฮสต์ของฉัน ระบบ (win7) ตามที่ฉันบอกว่าโฟลเดอร์ที่ใช้ร่วมกันของกล่องเสมือนช้าจริง ๆ ดังนั้นวิธีแก้ปัญหาอาจจะซิงค์โฟลเดอร์ nfs ที่เชื่อมต่อกับที่อื่นเช่น / var / www แต่วิธีการทั่วไปไม่ทำงานฉันลองใช้ไฟล์ต่างๆเช่น icrontab fam จะช่วยได้ แต่ฉันไม่รู้ว่าจะเริ่มหรือใช้มันอย่างไร
BlackScorp

@BlackScorp ตามความเป็นจริงคุณติดกับ rsync เพียงอย่างเดียวและปล่อยให้มันตัดสินใจว่าต้องการซิงค์อะไร ในขณะที่ฉันตอบคำถามด้วยนั่นไม่ใช่ตัวเลือกที่แย่มาก
Oli

1
อีกทางเลือกหนึ่งคือการผลักไฟล์จากโฮสต์แทนที่จะพยายามตรวจจับการเปลี่ยนแปลงจากระยะไกล
Oli

วิธีแก้ปัญหาที่ฉันใช้มาก่อนมันมี 2 ปัญหา: 1) ฉันต้องทบทวนทุกครั้งที่กล่องเสมือนของฉันเพื่อแก้ไขไฟล์ซึ่งหมายความว่าเสมือนของฉันต้องทำงานการแก้ไขด่วนไม่ทำงานอีกต่อไป 2) ฉันไม่รู้ว่าทำไม แต่เพราะ ของโครงการสแกนของแซมบ้า (Netbeans) แซมบ้าแสดงการใช้ CPU 99% และทุกอย่างภายในกล่องเสมือนนั้นช้ามากในขณะที่กำลังพัฒนาฉันจะลองใช้ rsyn + cronjob solution หรือ php build ในเว็บเซิร์ฟเวอร์
BlackScorp

inotifywaitวิธีการแก้ปัญหามีหนึ่งอุปสรรคเล็กน้อย แต่ที่สำคัญมันไม่ได้ตรวจสอบการเปลี่ยนแปลงที่เกิดขึ้นเมื่อrsyncมีการเรียกใช้ พิจารณาสถานการณ์ต่อไปนี้: ไฟล์ A เปลี่ยนไป; rsync จะถูกเรียก; เมื่อ rsync เกือบจะทำการซิงโครไนซ์ไฟล์ A ไฟล์ B จะถูกเปลี่ยน ตอนนี้rsyncเสร็จสิ้นแล้วและinotifywaitกำลังทำงานอยู่ แต่ไฟล์ B จะไม่ซิงโครไนซ์และจะไม่ถูกซิงโครไนซ์จนกว่าจะมีการเปลี่ยนแปลงในครั้งต่อไป พิจารณาใช้lsyncdตามที่แนะนำโดย @Arigion
MarSoft

6

คุณสามารถใช้Lsyncd (Live Syncing Daemon) :

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

นี่คือตัวอย่างการสอนสำหรับ Ubuntu 16.04


2

คุณสามารถใช้และinotifywait เมื่อเปิดใช้งานกิจกรรม วิธีนี้คุณจะซิงโครไนซ์กับเซิร์ฟเวอร์ของคุณเฉพาะเมื่อไฟล์เปลี่ยนแปลงมิฉะนั้นจะซิงค์เมื่อใดก็ตามที่อ่านไฟล์ (ผู้แก้ไขอ่านไฟล์ของคุณหลายครั้งเพื่อตรวจสอบว่ามีการเปลี่ยนแปลงหรือไม่) ดังนั้นกล่าวว่า:rsyncinotifywaitmodify,create,delete

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

สิ่งนี้จะไม่ตรวจพบการเปลี่ยนแปลงที่เกิดขึ้นขณะที่ rsync กำลังทำงาน พิจารณาใช้lsyncdตามที่แนะนำโดย @Arigion
MarSoft

นี่จะใช้เหตุการณ์ทั้งหมดในไฟล์ทั้งหมดอีกครั้งหลังจากการเปลี่ยนแปลงแต่ละครั้ง ... และเมื่อมีการใช้งานจะไม่เห็นการเปลี่ยนแปลงใด ๆ ในช่วงเวลานั้น ...
Somebody

0

ขยายความคิดเห็นเล็กน้อยไปยังคำตอบที่ได้รับการยอมรับฉันประสบความสำเร็จในการใช้fswatchเพื่อเรียกscpไฟล์ที่มีการเปลี่ยนแปลงให้กับแขก บน Linux นี่เป็น wrapper รอบ ๆinotifyแต่มันก็เป็น cross-platform (ฉันใช้ Mac กับแขก QEMU ที่ทำงานด้วย Arm-based) ฉันได้ติดตั้งsshรีโมตบิลด์ไว้เช่นกัน วิธีการผลักดันทำงานได้ดีกับหุ้นที่มีพฤติกรรมน้อยกว่าอุดมคติ

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