ตรวจหาไฟล์ใหม่อย่างต่อเนื่องด้วย inotify-tools ภายในหลายไดเรกทอรีซ้ำ


17

ฉันเพิ่งติดตั้ง inotify-tools ฉันต้องการตรวจสอบไฟล์ใหม่อย่างต่อเนื่องด้วยเครื่องมือแจ้งเตือนภายในหลายไดเรกทอรีซ้ำและส่งอีเมลโดยใช้ postfix ฉันอาจจะสามารถจัดการกับการส่งอีเมลโดยใช้ส่วน postfix ฉันแค่พยายามหาวิธีที่ดีที่สุดในการทำสิ่งนี้เมื่อพยายามตรวจหาไฟล์ใหม่ เพราะบางครั้งมีการเพิ่มไฟล์หลายไฟล์พร้อมกัน

คำตอบ:


39

inotifywait (ส่วนหนึ่งของinotify-tools ) เป็นเครื่องมือที่เหมาะสมในการบรรลุวัตถุประสงค์ของคุณไม่สำคัญว่าจะมีการสร้างไฟล์หลายไฟล์พร้อมกันก็จะตรวจจับได้

นี่คือตัวอย่างสคริปต์:

#!/bin/sh
MONITORDIR="/path/to/the/dir/to/monitor/"
inotifywait -m -r -e create --format '%w%f' "${MONITORDIR}" | while read NEWFILE
do
        echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "yourmail@addresshere.tld"
done

inotifywaitจะใช้ตัวเลือกเหล่านี้

- mเพื่อตรวจสอบ dir ไปเรื่อย ๆ หากคุณไม่ได้ใช้ตัวเลือกนี้เมื่อตรวจพบไฟล์ใหม่แล้วสคริปต์จะสิ้นสุด

-rจะตรวจสอบไฟล์ซ้ำ ๆ (หากมีไฟล์จำนวนมาก / ไฟล์อาจใช้เวลาสักครู่ในการตรวจสอบไฟล์ที่สร้างขึ้นใหม่)

- สร้างเป็นตัวเลือกในการระบุเหตุการณ์ที่จะตรวจสอบและในกรณีของคุณมันควรจะสร้างเพื่อดูแลเกี่ยวกับไฟล์ใหม่

- รูปแบบ '% w% f'จะพิมพ์ไฟล์ในรูปแบบ /complete/path/file.name

"$ {MONITORDIR}"เป็นตัวแปรที่มีเส้นทางที่จะตรวจสอบว่าเราได้กำหนดไว้ก่อนหน้านี้

ดังนั้นในกรณีที่ไฟล์ใหม่จะถูกสร้างขึ้นinotifywait จะตรวจสอบได้และจะพิมพ์เอาท์พุท (/complete/path/file.name) ไปยังท่อและในขณะที่จะกำหนดผลลัพธ์ที่จะ newfile

ในขณะที่ลูปคุณจะเห็นวิธีการส่งเมลไปยังที่อยู่ของคุณโดยใช้ยูทิลิตี้ mailxที่ควรทำงานได้ดีกับ MTA ท้องถิ่นของคุณ (ในกรณีของคุณ Postfix)

หากคุณต้องการตรวจสอบหลายไดเรกทอรี inotifywait ไม่อนุญาต แต่คุณมีสองตัวเลือกให้สร้างสคริปต์สำหรับทุก dir เพื่อตรวจสอบหรือสร้างฟังก์ชันภายในสคริปต์สิ่งนี้:

#!/bin/sh
MONITORDIR1="/path/to/the/dir/to/monitor1/"
MONITORDIR2="/path/to/the/dir/to/monitor2/"
MONITORDIRX="/path/to/the/dir/to/monitorx/"    

monitor() {
inotifywait -m -r -e create --format "%f" "$1" | while read NEWFILE
do
        echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "yourmail@addresshere.tld"
done
}
monitor "$MONITORDIR1" &
monitor "$MONITORDIR2" &
monitor "$MONITORDIRX" &

ฉันลืมที่จะเพิ่มคำอธิบายหลายอย่างเกี่ยวกับคำสั่งที่ใช้ในสคริปต์ตัวอย่างนั่นคือเหตุผลในการแก้ไขคำตอบของฉัน ... ฉันยังเพิ่มสคริปต์ในกรณีที่ op ต้องการตรวจสอบ dirs หลาย เกี่ยวกับเครื่องมือ inotifywait มันเป็นไปไม่ได้ที่จะตอบคำถามโดยไม่พูดถึงมันเพราะ op กำลังใช้ inotify-tools ฉันเป็นมือใหม่ที่นี่ดังนั้นฉันต้องเรียนรู้มากมายเกี่ยวกับ netiquette ดังนั้นขออภัยถ้าคำตอบของฉันทับคุณมันไม่ใช่สิ่งที่ฉันต้องการฉันแค่ต้องการให้คำตอบที่สมบูรณ์ให้กับ op อีกครั้งขอโทษ
sahsanu

ไม่มีปัญหาและยินดีต้อนรับสู่ SU การเรียนรู้เกี่ยวกับ netiquette นั้นมักจะทำได้ยากเนื่องจากไม่ได้กำหนดไว้ที่ใดเลย
harrymc

4
@sahsanu ฉันไม่เห็นด้วยกับสิ่งที่ "netiquette" ทั้งหมด แต่ละคนตอบคำถามจากมุมมองของตนเอง ไม่มีคำทับซ้อนกันระหว่างคำตอบและไม่มีคำตอบที่ถูกเขียนใหม่ เป็นไปไม่ได้ที่คำตอบจะแตกต่างกันในลักษณะนั้นเมื่อคำถามนั้นเฉพาะเจาะจง ขอบคุณมากที่สละเวลาตอบคำถามอย่างละเอียด สิ่งนี้ช่วยได้มากกว่าที่คุณรู้สำหรับคนอย่างฉันที่เพิ่งเรียนรู้เกี่ยวกับสิ่งนี้ทั้งหมด คุณช่วยฉันชั่วโมงนับไม่ถ้วน
David Custer


ไม่สามารถกำหนด Netiquette ในสภาพแวดล้อมที่มีการพัฒนาอย่างแน่นอนมันเป็นธรรมเนียมในเว็บไซต์นี้ที่จะไม่ทำซ้ำคำตอบเว้นแต่ว่าพวกเขาจะเขียนไม่ดีและมันก็ควรที่จะแก้ไขให้ถูกต้องแทนที่จะแก้ไข มันเป็นสิทธิของคุณในชุมชนประชาธิปไตยที่จะไม่เห็นด้วยเสมอ @sahsanu สามารถหลีกเลี่ยงคำพูดของฉันโดยอ้างถึงคำตอบก่อนหน้าของฉันในขณะที่แสดงสคริปต์ของเขาซึ่งจะได้รับการอนุมัติของคุณในกรณีใด ๆ นั่นคือสิ่งที่ฉันจะทำในสถานที่ของเขาและนั่นคือ Netiquette ของฉันซึ่งฉันเชื่อว่าฉันแบ่งปันกับผู้อื่น (แต่ไม่ใช่สำหรับทุกคน)
harrymc

8

ใช้inotifywaitตัวอย่างเช่น:

inotifywait -m /path -e create -e moved_to |
    while read path action file; do
        echo "The file '$file' appeared in directory '$path' via '$action'"
        # do something with the file
    done

สำหรับข้อมูลเพิ่มเติมและตัวอย่างดูบทความ
วิธีการใช้เครื่องมือ inotify สคริปต์ทริกเกอร์เกี่ยวกับเหตุการณ์ที่ระบบแฟ้ม


1
หากใครใช้สิ่งนี้และแปลงตัวแปรจากการอ่านเป็นตัวพิมพ์ใหญ่คุณจะไม่สามารถเรียกใช้คำสั่งบางอย่างได้ในขณะนี้ นี่เป็นเพราะคุณจะเขียนทับตัวแปร $ PATH
Savageman

2
@Savageman ใช้ชื่อตัวแปรตัวพิมพ์ใหญ่สำหรับตัวแปรของคุณเองเป็นอย่างยิ่งท้อแท้ได้อย่างแม่นยำด้วยเหตุนี้ ชื่อตัวแปรตัวพิมพ์ใหญ่ถูกสงวนไว้สำหรับการใช้งานระบบ ตัวแปรของคุณเองควรใช้ตัวพิมพ์เล็ก
tripleee

@tripleee ขอบคุณสำหรับข้อมูลที่จะไม่ใช้บนกรณี VARs อีกต่อไป :)
Savageman

0

สำหรับหลายไดเรกทอรีคุณสามารถทำได้:

#!/bin/bash


monitor() {
  inotifywait -m -r -e attrib --format "%w%f" --fromfile /etc/default/inotifywait | while read NEWFILE
  do
     echo "This is the body of your mail" | mailx -s "File ${NEWFILE} has been created" "yourmail@addresshere.tld"
  done
          }


monitor &

นี่คือรายการตัวอย่างของโฟลเดอร์ในไฟล์ /etc/default/inotifywait /etc/default/inotifywait

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