วิธีการเรียกใช้คำสั่งเมื่อมีการอัปเดตเนื้อหาของไดเรกทอรี


27

มีไดเรกทอรีAที่เนื้อหาถูกเปลี่ยนแปลงบ่อยครั้งโดยบุคคลอื่น

ผมได้ทำไดเรกทอรีส่วนตัวที่ผมเก็บไฟล์ทั้งหมดที่ได้เคยอยู่ในBA

ขณะนี้ฉันทำงานเพียงบางครั้งrsyncที่จะได้รับไฟล์ที่จะได้รับการสนับสนุนเพิ่มขึ้นจากการA Bแต่ผมกลัวความเป็นไปได้ว่าไฟล์บางส่วนจะได้รับการบันทึกในAแล้วลบออกจากก่อนที่ผมจะได้รับโอกาสในการคัดลอกพวกเขาไปยังAB

วิธีที่ดีที่สุดในการป้องกันไม่ให้เกิดขึ้นคืออะไร? โดยอุดมคติแล้วฉันต้องการให้สคริปต์สำรองปัจจุบันทำงานทุกครั้งที่เนื้อหาAถูกเปลี่ยนแปลง

คำตอบ:


29

หากคุณมีinotify-toolsติดตั้งอยู่คุณสามารถใช้inotifywaitเพื่อทริกเกอร์การกระทำหากไฟล์หรือไดเรกทอรีถูกเขียนไปที่:

#!/bin/sh
dir1=/path/to/A/
while inotifywait -qqre modify "$dir1"; do
    /run/backup/to/B 
done

ในกรณีที่-qqสวิตช์เงียบสนิท-rจะเรียกซ้ำ (หากจำเป็น) และ-eเป็นเหตุการณ์ที่ต้องตรวจสอบในกรณีmodifyนี้ จากman inotifywait:

แก้ไข
ไฟล์ที่ถูกตรวจสอบหรือไฟล์ภายในไดเรกทอรีที่ตรวจสอบแล้วนั้นถูกเขียนไป

5
incrondอาจเป็นที่สนใจ
Shawn J. Goff

1
เย็น. ฉันจะใส่สคริปต์ข้างต้นใน bashrc ของฉันเพื่อให้มันทำงานเมื่อฉันเข้าสู่ระบบ? มีวิธีอื่นที่ฉันสามารถใช้งานได้ตลอดเวลาหรือไม่
oadams

สำหรับการเข้าสู่ระบบใช่/etc/profileสำหรับทั้งระบบหรือ.bash_profileเฉพาะผู้ใช้ของคุณ ในการรันหลังจากบูตมันขึ้นอยู่กับรสชาติของ Unix / Linux /etc/rc.local, /etc/rc.d/หรือ/etc/init.d/
jasonwryan

1
สำหรับไดเรกทอรีขนาดใหญ่คุณอาจต้องการพิจารณาใช้--monitorสวิตช์ (และinotifywait
ไพพ์

วิธีแก้ปัญหานี้จะทำงานได้อย่างน่าเชื่อถือในการรันสคริปต์สำหรับแต่ละไฟล์ที่ถูกเพิ่มในทรีไดเรกทอรีผ่านเซิร์ฟเวอร์ FTP (สมมติว่าไฟล์ใหม่ถูกเพิ่มทุก 3 นาทีโดยเฉลี่ยและอาจใช้เวลานานหลายปี) ถ้าไม่มากมีทางเลือกอื่นไหม?
Nikola Novak

5

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

หากคุณสามารถติดตั้งระบบแฟ้มที่คุณเลือกบนไดเรกทอรีว่า (ฉันรู้นี้อาจจะไม่ได้เป็นตัวเลือก), คุณสามารถใส่หนึ่งที่บันทึกรุ่นของแฟ้มทั้งหมดตัวอย่างเช่นcopyfs


4

ลองใช้entrเครื่องมือบรรทัดคำสั่งที่สามารถเรียกใช้คำสั่งโดยพลการเมื่อมีการเปลี่ยนแปลงไฟล์ ตั้งแต่ 2.9 รีลีสจะมีการเพิ่มตัวเลือกการเฝ้าดูไดเรกทอรี ( -d) เพื่อตอบสนองต่อเหตุการณ์เมื่อมีการเพิ่มไฟล์ใหม่ในไดเรกทอรี

ตัวอย่างการเรียกใช้ยูทิลิตี้หากมีการเพิ่มไฟล์ใหม่ในโครงการ:

$ while true; do
> echo src/* | entr -d your_command
> done

ในโหมดเฝ้าดูไดเรกทอรีไดเรกทอรีหลักของแต่ละไฟล์จะถูกเพิ่มเข้าไปในรายการเฝ้าดูโดยปริยาย

ความหมายเดียวของสิ่งนี้คือถ้าไฟล์ใหม่ปรากฏขึ้นจะต้องออกเพื่อให้เปลือกวงภายนอกทำการสแกนระบบไฟล์อีกครั้ง

นี่คือรุ่นที่ไม่มีตัวเลือกการเฝ้าดูไดเรกทอรี:

$ while true; do
> echo src/* src | entr your_command
> done

นี่เป็นตัวอย่างที่ง่ายขึ้นอยู่กับความต้องการของคุณ:

$ ls -d * | entr sh -c 'rsync -vuar A B'

ตรวจสอบ: เว็บไซต์entrproject.orgสำหรับรายละเอียดเพิ่มเติม


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