ฉันต้องการเรียกใช้สคริปต์โดยอัตโนมัติเมื่อใดก็ตามที่มีการคัดลอกไฟล์ใหม่ไปยังไดเรกทอรีเฉพาะ กล่าวอีกนัยหนึ่งมีวิธีใน Linux ในการ "เฝ้าดู" ไดเรกทอรีสำหรับการเปลี่ยนแปลงแล้วเรียกใช้บางสิ่งบางอย่างในการตอบสนองต่อการเปลี่ยนแปลงหรือไม่
ฉันต้องการเรียกใช้สคริปต์โดยอัตโนมัติเมื่อใดก็ตามที่มีการคัดลอกไฟล์ใหม่ไปยังไดเรกทอรีเฉพาะ กล่าวอีกนัยหนึ่งมีวิธีใน Linux ในการ "เฝ้าดู" ไดเรกทอรีสำหรับการเปลี่ยนแปลงแล้วเรียกใช้บางสิ่งบางอย่างในการตอบสนองต่อการเปลี่ยนแปลงหรือไม่
คำตอบ:
ถ้าคุณโชคดีพอที่จะอยู่ในการกระจาย apt-get install dnotify
Debian-based การกระจายอื่น ๆ อาจมีบางสิ่งที่คล้ายกัน - ค้นหาdnotify
ชื่อ
dnotify เป็นโปรแกรมง่าย ๆ ที่ใช้ลินุกซ์เคอร์เนล 2.4.19 + ของ dnotify API dnotify สามารถดำเนินการคำสั่งที่ระบุในแต่ละครั้งที่เนื้อหาของการเปลี่ยนแปลงไดเรกทอรีที่เฉพาะเจาะจง มันถูกเรียกใช้จากบรรทัดคำสั่งและรับสองอาร์กิวเมนต์: หนึ่งหรือมากกว่าหนึ่งไดเรกทอรีเพื่อตรวจสอบและคำสั่งให้ดำเนินการเมื่อใดก็ตามที่มีการเปลี่ยนแปลงไดเรกทอรี ตัวเลือกควบคุมกิจกรรมที่จะทริกเกอร์: เมื่อไฟล์ถูกอ่านในไดเรกทอรีเมื่อมีการสร้างลบและอื่น ๆ
หากคุณต้องการจัดการสิ่งนี้ภายในโปรแกรมของคุณเอง dnotify ก็เป็น API ที่คุณต้องการใช้เช่นกัน
emerge inotify-tools
คุณสามารถเรียกใช้สคริปต์ด้วย inotify-tools บางอย่างเช่นนี้ มันจะดูไดเรกทอรีสำหรับการเปลี่ยนแปลงในไฟล์ที่แก้ไขไฟล์ใหม่และไฟล์ที่ถูกลบจากนั้นมันจะรันสคริปต์
#!/bin/sh
while inotifywait -e modify -e create -e delete /home/me/code; do
rsync [options] /home/me/code/ /media/nfs/code/
done
ฉันคิดว่าอินครอนเป็นสิ่งที่คุณต้องการ มันใช้ inotify เป็นกลไกการแจ้งเตือน (ซึ่งอย่างที่คนอื่น ๆ ชี้, superden dnotify), แต่ไม่ต้องการสคริปต์ที่ทำงานอย่างต่อเนื่อง, ใช้ inotifywait หรือคล้ายกัน (แม้ว่าเห็นได้ชัดว่า incron daemon ทำงานตลอดเวลา) 'crontabs' ทั้งระบบและผู้ใช้ 'crontabs' ได้รับการสนับสนุนในลักษณะที่คล้ายคลึงกับ cron มาตรฐาน แต่แทนที่จะระบุเวลาเป็นทริกเกอร์ inotify เหตุการณ์และชื่อไฟล์ / ไดเรกทอรีจะถูกนำมาใช้
ฉันเชื่อว่า incron นั้นมีการจัดจำหน่ายไว้มากมายเช่น Ubuntu และ Debian
มีซอฟต์แวร์บางส่วนสำหรับวัตถุประสงค์นี้โดยอัตโนมัติ คุณอาจต้องการตรวจสอบ
entrเป็นเครื่องมือแจ้งเตือนไฟล์ที่เรียบง่ายและสามารถแต่งได้มากที่สุดที่ฉันเคยเห็น การใช้งานนั้นได้รับการปรับให้เหมาะกับการดูไฟล์มากกว่าไดเรกทอรี แต่ก็สามารถแก้ไขกรณีของคุณได้
การตรวจสอบและดำเนินการกับไฟล์เพิ่มรวมกับเครื่องมืออื่น ๆ make
เช่นเช่น entr
ไม่ได้ส่งชื่อหรืออะไรทำนองนั้นมันแค่วิ่งสิ่งที่คุณบอกให้มันทำงาน
วิธีตรวจสอบไฟล์ที่เพิ่มเข้ามาในไดเรกทอรี:
## entr exits with rc=0 when terminated
## rc=1 when watched files go away or don't exist to begin with
## rc=2 when new files arrive in watched directories
until echo /path/to/directory_to_watch | entr -d do_stuff
do sleep 1; done
หากคุณต้องการที่จะกระทำเมื่อไฟล์ที่มีอยู่มีการเปลี่ยนแปลง:
## Here's why it comes in handy that entr exits when new files are added --
## find gets re-run.
until find /path/to/directory_to_watch/ -path /path/to/directory_to_watch/* |
entr -d do_stuff
do sleep 1; done
... และนั่นคือสิ่งที่กลไกการวนซ้ำใช้งานได้สะดวกเนื่องจากfind
นิพจน์จะทำงานอีกครั้งหากมีการเพิ่มไฟล์
หากคุณต้องการการจัดการข้อผิดพลาดที่ดีขึ้นและต้องการให้แน่ใจว่าสิ่งต่าง ๆ ทำงานเพียงครั้งเดียวต่อการเพิ่ม / ลบไฟล์สิ่งต่าง ๆ ค่อนข้างแปลก แต่สำหรับกรณีง่าย ๆ เหล่านี้มันยอดเยี่ยม
แก้ไข: หากคุณต้องการทำสิ่งนี้ในระดับระบบบางอย่างเช่นincronเพียงเพิ่มสคริปต์ลงในตัวจัดการกระบวนการโปรดของคุณ (เช่นs6 , runit , systemdหรือsysvinitและข้ามลูป:
#!/bin/bash
exec entr -d do_stuff < <(find /path/to/directory_to_watch/ -path /path/to/directory_to_watch/*)
exec
และเปลี่ยนตัวกระบวนการ ( <(...)
) มีความสำคัญเมื่อวิ่งออกมาจากผู้จัดการกระบวนการในการจัดการการส่งสัญญาณอย่างถูกต้อง (เช่นจะได้รับเปลือกออกจากทาง)