ทำไม inotifywatch ตรวจไม่พบการเปลี่ยนแปลงของไฟล์ที่เพิ่มเข้ามา?


14

ฉันพยายามตรวจสอบ/tmpโฟลเดอร์เพื่อดูการเปลี่ยนแปลงโดยใช้inotifywatch:

sudo inotifywatch -v -r /tmp

หลังจากสร้างไฟล์สองสามไฟล์ ( touch /tmp/test-1 /tmp/test-2) ฉันจะยกเลิกinotifywatch(โดยCtrl- Cซึ่งแสดงสถิติต่อไปนี้ให้ฉันดู

Establishing watches...
Setting up watch(es) on /tmp
OK, /tmp is now being watched.
Total of 39 watches.
Finished establishing watches, now collecting statistics.
total  attrib  close_write  open  create  filename
8      2       2            2     2       /tmp/

ผลลัพธ์พิมพ์เฉพาะสถิติ แต่ไม่ใช่ไฟล์ที่ฉันคาดไว้ (เหมือนที่นี่หรือที่นี่ ) ฉันพยายามที่แตกต่างกันในการเข้าถึง (ผ่านcat, mktempฯลฯ ) แต่มันเป็นสิ่งเดียวกัน

ฉันพลาดอะไรไปหรือเปล่า? เป็นเพราะฉันใช้ VPS และบางอย่างถูก จำกัด

ระบบปฏิบัติการ: Debian 7.3 (inotify-tools) บน VPS

คำตอบ:


14

นี่เป็นเพราะวิธีการใช้งานของinotifywatchคุณและวิธีการทำงานของเครื่องมือ เมื่อคุณเรียกinotifywatch -r /tmpคุณเริ่มดู/tmpและไฟล์ทั้งหมดที่มีอยู่แล้วในนั้น เมื่อคุณสร้างในไฟล์/tmpเมไดเรกทอรีที่มีการปรับปรุงเพื่อให้มีจำนวน inode ไฟล์ใหม่ซึ่งหมายถึงว่าการเปลี่ยนแปลงที่เกิดขึ้นในไม่/tmp /tmp/test-1นอกจากนี้เนื่องจาก/tmp/test-1ไม่ได้อยู่ที่นั่นเมื่อinotifywatchเริ่มต้นจึงไม่มีinotifyนาฬิกาวางไว้ มันหมายความว่าเหตุการณ์ใด ๆ ที่เกิดขึ้นในไฟล์ที่สร้างขึ้นหลังจากนาฬิกาได้ถูกวางไว้จะไม่ถูกตรวจพบ คุณอาจเข้าใจได้ดีขึ้นหากคุณเห็นด้วยตนเอง:

$ inotifywatch -rv /tmp &
Total of n watches.
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n

หากคุณเปิดใช้งานกลไกการติดตามinotify_add_watch(2)คำสั่งสุดท้ายจะให้จำนวนนาฬิกาที่ตั้งค่าโดยinotifywatchคุณ หมายเลขนี้ควรตรงกับหมายเลขที่กำหนดโดยinotifywatchตัวมันเอง ตอนนี้สร้างไฟล์ภายใน/tmpและตรวจสอบอีกครั้ง:

$ inotifywatch -rv /tmp &
Total of n watches.
$ touch /tmp/test1.txt
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n

จำนวนจะไม่เพิ่มขึ้นซึ่งหมายความว่าไฟล์ใหม่จะไม่ถูกดู โปรดทราบว่าพฤติกรรมนั้นแตกต่างกันหากคุณสร้างไดเรกทอรีแทน:

$ inotifywatch -rv /tmp &
Total of n watches.
$ mkdir /tmp/test1
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n + 1

นี่เป็นเพราะวิธีการ-rทำงานของสวิตช์ :

-r, --recursive: [... ] หากมีการสร้างไดเรกทอรีใหม่ภายในไดเรกทอรีที่เฝ้าดูพวกเขาจะถูกเฝ้าดูโดยอัตโนมัติ

แก้ไข:ผมได้เล็ก ๆ น้อย ๆ สับสนระหว่างสองตัวอย่างของคุณ แต่ในกรณีแรกที่นาฬิกาจะถูกวางไว้อย่างถูกต้องเพราะโทรของผู้ใช้inotifywatchบน~/*(ซึ่งก็คือการขยายตัวเห็นความคิดเห็น don_crissti ที่นี่ ) ไดเรกทอรีบ้านจะดูก็เพราะมี~/.* ~/.ในทางทฤษฎีมันควรจะมี~/..ซึ่งรวมกับ-rสวิตช์ควรส่งผลในการดูระบบทั้งหมด

อย่างไรก็ตามมันเป็นไปได้ที่จะได้รับชื่อของไฟล์ที่ก่อให้เกิดเหตุการณ์ในไดเรกทอรีเฝ้าดู แต่ฉันเดาว่าinotifywatchจะไม่ดึงข้อมูลนี้ (มันถูกบันทึกไว้ลึกกว่าชื่อไดเรกทอรี) inotify-toolsมีเครื่องมืออื่นที่เรียกว่าinotifywaitซึ่งสามารถทำงานได้เหมือนกันมากinotify-watchและมีตัวเลือกเอาต์พุตเพิ่มเติม (รวมถึง%fซึ่งเป็นสิ่งที่คุณกำลังมองหาที่นี่):

inotifywait -m --format "%e %f" /tmp

จากหน้าคน :

--format <fmt>เอาต์พุตในรูปแบบที่ผู้ใช้ระบุโดยใช้ไวยากรณ์คล้ายกับ printf [... ] รองรับการแปลงต่อไปนี้:

%f: เมื่อมีเหตุการณ์เกิดขึ้นภายในไดเรกทอรีนี้จะถูกแทนที่ด้วยชื่อของไฟล์ที่ทำให้เกิดเหตุการณ์ที่จะเกิดขึ้น

%e: ถูกแทนที่ด้วยกิจกรรมที่เกิดขึ้นคั่นด้วยเครื่องหมายจุลภาค

นอกจากนี้-mตัวเลือก (มอนิเตอร์) จะยังคงinotifywaitทำงานหลังจากเหตุการณ์แรกซึ่งจะทำให้เกิดพฤติกรรมที่ค่อนข้างคล้ายกับinotifywatchของ


1
.bashrcในตัวอย่าง @ serverfaultไม่ปรากฏในสถิติเนื่องจากผู้ใช้ตรวจสอบโฮมไดเรกทอรีของมันซ้ำ ๆ แต่เนื่องจากpath/.*มีการขยายและเป็นผลให้นาฬิกาถูกตั้งค่าสำหรับ. ไฟล์ทั้งหมดภายใต้path/( .bashrcรวมอยู่) คำสั่งที่ใช้โดย OP จะไม่ส่งชื่อไฟล์ออกเนื่องจากนาฬิกาถูกตั้งค่าไว้/tmpและไดเรกทอรีย่อยใด ๆ ดังนั้นสถิติจะเกี่ยวข้องเฉพาะกับ/tmpและไดเรกทอรีย่อย (เช่นคุณจะเห็นไฟล์ถูกเข้าถึง / ย้าย / ฯลฯ แต่จะไม่บอกคุณ ชื่อ)
don_crissti

@don_crissti โอ๊ะฉันผสมสองตัวอย่างที่ได้รับจาก OP ฉันแก้ไขคำตอบแล้วขอบคุณ!
John WH Smith

ขอบคุณมันมีประโยชน์ นี่คือคำสั่งของฉันเพื่อแสดงเนื้อหาของไฟล์ที่สร้างขึ้นใหม่การทดสอบ * ทั้งหมดใน:/tmp inotifywait -m --format "%f" /tmp | grep --line-buffered ^test | xargs -L1 -I% sudo cat /tmp/% 2> /dev/null
kenorb

นอกจากนี้: " หมายความว่าเหตุการณ์ใด ๆ ที่เกิดขึ้นในไฟล์ที่สร้างขึ้นหลังจากวางนาฬิกาจะไม่ถูกตรวจพบ " เหตุการณ์ใด ๆ (แม้แต่การสร้างไฟล์) จะถูกตรวจพบเพราะนาฬิกาถูกตั้งค่าไว้แล้วสำหรับไดเรกทอรีที่มีอยู่และนี่คือ สะท้อนให้เห็นในสถิติสำหรับไดเรกทอรีเฉพาะนั้น ดูinotifywatchผลลัพธ์ในคำถาม OP: มี 2 createกิจกรรม (ตรวจพบดังนั้น) แต่เนื่องจากinotifywatchเฝ้าดูไดเรกทอรี (+ ไดเรกทอรีย่อยใด ๆ ) สถิติเกี่ยวข้องเฉพาะกับไดเรกทอรี / เหล่านั้นเท่านั้น
don_crissti

1
ฉันไม่คิดว่าเราอยู่ในช่วงความยาวคลื่นเดียวกันที่นี่ ... man inotify: When a directory is monitored, inotify will return events for the directory itself, and for files inside the directory.ยังman inotifywatchมีความชัดเจนเกี่ยวกับเหตุการณ์ที่กำลังรับชม: EVENTS>> ... ไฟล์ที่ถูกเฝ้าดูหรือไฟล์ภายในไดเรกทอรีที่เฝ้าดูถูกเข้าถึง / ปิด / เปิด / ฯลฯ (หมายถึงรวมถึงเหตุการณ์"ที่เกิดขึ้นกับไฟล์" ) กิจกรรมสำหรับไฟล์ที่สร้างขึ้นหลังจากการตั้งค่านาฬิกาบน dir พาเรนต์จะถูกตรวจพบ & สะท้อนในinotifywatchสถิติ (จะไม่พูดถึงไฟล์ที่เกิดเหตุการณ์เหล่านั้น)
don_crissti
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.