ใช้ inotify เพื่อตรวจสอบไดเรกทอรี แต่ไม่ทำงาน 100%


10

ฉันได้เขียนสคริปต์ทุบตีเพื่อตรวจสอบไดเรกทอรีเฉพาะ/root/secondfolder/:

#!/bin/sh

while inotifywait -mr -e close_write "/root/secondfolder/"
do
    echo "close_write"
done

เมื่อผมสร้างไฟล์ชื่อfourth.txtใน/root/secondfolder/และเขียนสิ่งที่มันบันทึกและปิดมันมันจะออกผลลัพธ์ต่อไปนี้:

/root/secondfolder/ CLOSE_WRITE,CLOSE fourth.txt

อย่างไรก็ตามมันไม่ได้สะท้อน "close_write" ทำไมถึงเป็นอย่างนั้น?

คำตอบ:


16

inotifywait -m คือโหมด "monitor" : ไม่เคยออก เชลล์รันมันและรอโค้ดออกให้ทราบว่าจะรันเนื้อความของลูปหรือไม่

หากคุณลบ-mมันจะทำงาน:

while inotifywait -r -e close_write "/root/secondfolder/"
do
    echo "close_write"
done

ผลิต

Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
/root/secondfolder/ CLOSE_WRITE,CLOSE bar
close_write
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
...

โดยค่าเริ่มต้น inotifywait จะ "ออกหลังจากเหตุการณ์แรกที่เกิดขึ้น" ซึ่งเป็นสิ่งที่คุณต้องการในสภาพลูป


แต่คุณอาจต้องการอ่านเอาต์พุตมาตรฐานของinotifywait:

#!/bin/bash

while read line
do
    echo "close_write: $line"
done < <(inotifywait -mr -e close_write "/tmp/test/")

นี้ (ทุบตี) สคริปต์จะอ่านแต่ละบรรทัดผลลัพธ์ของinotifywaitคำสั่งลงใน$lineตัวแปรภายในวงที่ใช้ทดแทนกระบวนการ มันหลีกเลี่ยงการตั้งค่านาฬิกาแบบเรียกซ้ำทุกครั้งที่วนรอบซึ่งอาจมีราคาแพง inotifywait ... | while read line ...ถ้าคุณไม่สามารถใช้ทุบตีคุณสามารถสั่งท่อเข้าไปในห่วงแทน: inotifywaitสร้างเอาต์พุตหนึ่งบรรทัดสำหรับแต่ละเหตุการณ์ในโหมดนี้ดังนั้นลูปจะรันหนึ่งครั้งสำหรับแต่ละเหตุการณ์


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