จะรันสคริปต์อัตโนมัติอย่างไรเมื่อเนื้อหาของไดเรกทอรีเปลี่ยนไปใน Linux


17

ฉันต้องการเรียกใช้สคริปต์โดยอัตโนมัติเมื่อใดก็ตามที่มีการคัดลอกไฟล์ใหม่ไปยังไดเรกทอรีเฉพาะ กล่าวอีกนัยหนึ่งมีวิธีใน Linux ในการ "เฝ้าดู" ไดเรกทอรีสำหรับการเปลี่ยนแปลงแล้วเรียกใช้บางสิ่งบางอย่างในการตอบสนองต่อการเปลี่ยนแปลงหรือไม่


การสนทนานี้จัดขึ้นในทุกไซต์ stackexchange;) ดูsuperuser.com/questions/181517/… stackoverflow.com/questions/4380527/เป็นต้น ฯลฯ
masterxilo

คำตอบ:


17

ถ้าคุณโชคดีพอที่จะอยู่ในการกระจาย apt-get install dnotifyDebian-based การกระจายอื่น ๆ อาจมีบางสิ่งที่คล้ายกัน - ค้นหาdnotifyชื่อ

dnotify เป็นโปรแกรมง่าย ๆ ที่ใช้ลินุกซ์เคอร์เนล 2.4.19 + ของ dnotify API dnotify สามารถดำเนินการคำสั่งที่ระบุในแต่ละครั้งที่เนื้อหาของการเปลี่ยนแปลงไดเรกทอรีที่เฉพาะเจาะจง มันถูกเรียกใช้จากบรรทัดคำสั่งและรับสองอาร์กิวเมนต์: หนึ่งหรือมากกว่าหนึ่งไดเรกทอรีเพื่อตรวจสอบและคำสั่งให้ดำเนินการเมื่อใดก็ตามที่มีการเปลี่ยนแปลงไดเรกทอรี ตัวเลือกควบคุมกิจกรรมที่จะทริกเกอร์: เมื่อไฟล์ถูกอ่านในไดเรกทอรีเมื่อมีการสร้างลบและอื่น ๆ

หากคุณต้องการจัดการสิ่งนี้ภายในโปรแกรมของคุณเอง dnotify ก็เป็น API ที่คุณต้องการใช้เช่นกัน


4
@MikeB หลังจากที่ Googling ทำให้คุณไม่แนะนำให้ใช้ฉันก็ลงเอยด้วยการใช้ inotify แทน ขอบคุณที่ชี้ทิศทางที่ถูกต้องให้ฉัน apt-get install inotify-tools
GeneQ

7
@GeneQ inotify ได้แทนที่ dnotify
David

1
เช่นเดียวกันกับ Gentoo:emerge inotify-tools
James Sneeringer

ใช่ฉันจะบอกว่าเคอร์เนล 2.4.19 เป็นชนิดของโบราณ ;-) inotify เป็นวิธีที่จะไป
David Z

โอ้ใช่ ... ฉันลืมซึ่งเมื่อเร็ว ๆ นี้ :)
MikeyB

12

คุณสามารถเรียกใช้สคริปต์ด้วย 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

เพียงคำนึงว่าถ้าไดเรกทอรีต้นทางเปลี่ยนแปลงในขณะที่กำลังถูกคัดลอก inotifywait จะไม่เห็นและการเปลี่ยนแปลงเหล่านั้นจะไม่ถูกคัดลอกจนกว่าจะมีการเปลี่ยนแปลงเพิ่มเติมเมื่อการคัดลอกเสร็จสิ้น อาจไม่ใช่ปัญหา แต่
Raúl Salinas-Monteagudo

คุณจะรันโหมดนี้ในโหมด daemon ได้อย่างไร?
Chris F

4

ฉันคิดว่าอินครอนเป็นสิ่งที่คุณต้องการ มันใช้ inotify เป็นกลไกการแจ้งเตือน (ซึ่งอย่างที่คนอื่น ๆ ชี้, superden dnotify), แต่ไม่ต้องการสคริปต์ที่ทำงานอย่างต่อเนื่อง, ใช้ inotifywait หรือคล้ายกัน (แม้ว่าเห็นได้ชัดว่า incron daemon ทำงานตลอดเวลา) 'crontabs' ทั้งระบบและผู้ใช้ 'crontabs' ได้รับการสนับสนุนในลักษณะที่คล้ายคลึงกับ cron มาตรฐาน แต่แทนที่จะระบุเวลาเป็นทริกเกอร์ inotify เหตุการณ์และชื่อไฟล์ / ไดเรกทอรีจะถูกนำมาใช้

ฉันเชื่อว่า incron นั้นมีการจัดจำหน่ายไว้มากมายเช่น Ubuntu และ Debian



0

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และเปลี่ยนตัวกระบวนการ ( <(...)) มีความสำคัญเมื่อวิ่งออกมาจากผู้จัดการกระบวนการในการจัดการการส่งสัญญาณอย่างถูกต้อง (เช่นจะได้รับเปลือกออกจากทาง)

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