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