ฉันพบปัญหานี้และไม่มีคำตอบใดที่ให้คำตอบว่า " แต่ละกระบวนการใช้นาฬิกาเป็นจำนวนเท่าไร" ผู้เดินสมุทรรายหนึ่งทั้งหมดให้คุณเปิดอินสแตนซ์ได้กี่ครั้งซึ่งเป็นเพียงส่วนหนึ่งของเรื่องราวและเนื้อหาการติดตามมีประโยชน์สำหรับการดูนาฬิกาใหม่ที่กำลังเปิดเท่านั้น
TL; DR:นี่จะให้ไฟล์ที่มีรายการinotify
อินสแตนซ์ที่เปิดอยู่และจำนวนนาฬิกาที่พวกเขามีรวมถึง pids และไบนารีที่วางไข่เรียงลำดับตามลำดับจากมากไปน้อยตามจำนวนการดู:
sudo lsof | awk '/anon_inode/ { gsub(/[urw]$/,"",$4); print "/proc/"$2"/fdinfo/"$4; }' | while read fdi; do count=$(sudo grep -c inotify $fdi); exe=$(sudo readlink $(dirname $(dirname $fdi))/exe); echo -e $count"\t"$fdi"\t"$exe; done | sort -nr > watches
นั่นเป็นปัญหาใหญ่ดังนั้นนี่คือวิธีที่ฉันไปถึงที่นั่น ในการเริ่มต้นฉันรันtail
ไฟล์ทดสอบและดูไฟล์ fd ที่เปิดอยู่:
joel@gladstone:~$ tail -f test > /dev/null &
[3] 22734
joel@opx1:~$ ls -ahltr /proc/22734/fd
total 0
dr-xr-xr-x 9 joel joel 0 Feb 22 22:34 ..
dr-x------ 2 joel joel 0 Feb 22 22:34 .
lr-x------ 1 joel joel 64 Feb 22 22:35 4 -> anon_inode:inotify
lr-x------ 1 joel joel 64 Feb 22 22:35 3 -> /home/joel/test
lrwx------ 1 joel joel 64 Feb 22 22:35 2 -> /dev/pts/2
l-wx------ 1 joel joel 64 Feb 22 22:35 1 -> /dev/null
lrwx------ 1 joel joel 64 Feb 22 22:35 0 -> /dev/pts/2
ดังนั้น 4 คือ fd ที่เราต้องการตรวจสอบ มาดูกันว่ามีอะไรบ้างในเรื่องfdinfo
นั้น:
joel@opx1:~$ cat /proc/22734/fdinfo/4
pos: 0
flags: 00
mnt_id: 11
inotify wd:1 ino:15f51d sdev:ca00003 mask:c06 ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:1df51500a75e538c
ดูเหมือนว่ารายการสำหรับนาฬิกาที่อยู่ด้านล่าง!
ลองทำอะไรกับนาฬิกามากขึ้นคราวนี้ด้วยinotifywait
ยูทิลิตี้ดูสิ่งที่อยู่ใน/tmp
:
joel@gladstone:~$ inotifywait /tmp/* &
[4] 27862
joel@gladstone:~$ Setting up watches.
Watches established.
joel@gladstone:~$ ls -ahtlr /proc/27862/fd | grep inotify
lr-x------ 1 joel joel 64 Feb 22 22:41 3 -> anon_inode:inotify
joel@gladstone:~$ cat /proc/27862/fdinfo/3
pos: 0
flags: 00
mnt_id: 11
inotify wd:6 ino:7fdc sdev:ca00003 mask:fff ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:dc7f0000551e9d88
inotify wd:5 ino:7fcb sdev:ca00003 mask:fff ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:cb7f00005b1f9d88
inotify wd:4 ino:7fcc sdev:ca00003 mask:fff ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:cc7f00006a1d9d88
inotify wd:3 ino:7fc6 sdev:ca00003 mask:fff ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:c67f00005d1d9d88
inotify wd:2 ino:7fc7 sdev:ca00003 mask:fff ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:c77f0000461d9d88
inotify wd:1 ino:7fd7 sdev:ca00003 mask:fff ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:d77f00000053c98b
Aha! รายการเพิ่มเติม! ดังนั้นเราควรมีหกสิ่งในเวลา/tmp
นั้น:
joel@opx1:~$ ls /tmp/ | wc -l
6
ยอดเยี่ยม ใหม่ของฉันinotifywait
มีหนึ่งรายการในfd
รายการ (ซึ่งเป็นสิ่งที่หนึ่งสมุทรอื่น ๆ ที่นี่นับ) แต่หกรายการในfdinfo
ไฟล์ ดังนั้นเราจึงสามารถทราบได้ว่าจำนวนการเฝ้าดู fd ที่กำหนดสำหรับกระบวนการที่กำหนดนั้นใช้งานอย่างไรโดยดูจากfdinfo
ไฟล์ ทีนี้มารวมกันกับข้างต้นเพื่อหยิบรายการกระบวนการที่มีการแจ้งเตือนนาฬิกาเปิดอยู่และใช้การนับรายการในแต่ละfdinfo
รายการ นี่คล้ายกับข้างบนดังนั้นฉันจะทิ้งหนึ่งซับไว้ที่นี่:
sudo lsof | awk '/anon_inode/ { gsub(/[urw]$/,"",$4); print "/proc/"$2"/fdinfo/"$4; }' | while read fdi; do count=$(sudo grep -c inotify $fdi); echo -e $count"\t"$fdi; done
มีบางสิ่งที่หนาในที่นี่ แต่พื้นฐานคือฉันใช้awk
ในการสร้างfdinfo
เส้นทางจากlsof
เอาท์พุท, คว้าหมายเลข pid และ fd, ปอกธง u / r / w จากหลัง จากนั้นสำหรับแต่ละfdinfo
เส้นทางที่สร้างฉันจะนับจำนวนinotify
บรรทัดและส่งออกจำนวนและ pid
มันคงจะดีถ้าฉันมีกระบวนการอะไรที่ pids เหล่านี้แสดงอยู่ในที่เดียวกันใช่ไหม? ฉันคิดอย่างนั้น ดังนั้นในบิตยุ่งโดยเฉพาะฉันตัดสินโทรdirname
สองครั้งบนfdinfo
เส้นทางเพื่อรับแพ็ค/proc/<pid>
เพิ่ม/exe
ไปแล้วทำงานreadlink
บนที่เพื่อรับชื่อ exe ของกระบวนการ โยนลงไปที่นั่นเช่นกันเรียงตามจำนวนนาฬิกาและเปลี่ยนเส้นทางไปยังไฟล์เพื่อความปลอดภัยและเราจะได้รับ:
sudo lsof | awk '/anon_inode/ { gsub(/[urw]$/,"",$4); print "/proc/"$2"/fdinfo/"$4; }' | while read fdi; do count=$(sudo grep -c inotify $fdi); exe=$(sudo readlink $(dirname $(dirname $fdi))/exe); echo -e $count"\t"$fdi"\t"$exe; done | sort -n > watches
ทำงานโดยไม่ต้อง sudo เพียงแค่แสดงกระบวนการของฉันฉันเปิดตัวข้างต้นฉันได้รับ:
joel@gladstone:~$ cat watches
6 /proc/4906/fdinfo/3 /usr/bin/inotifywait
1 /proc/22734/fdinfo/4 /usr/bin/tail
ที่สมบูรณ์แบบ! รายการกระบวนการ fd's และจำนวนการเฝ้าดูแต่ละครั้งใช้ซึ่งเป็นสิ่งที่ฉันต้องการ
find /proc/*/fd/* -type l -lname 'anon_inode:inotify' -print