मैं इस समस्या में भाग गया, और इनमें से कोई भी उत्तर आपको "कितनी घड़ियों का उपयोग कर रहा है, जो वर्तमान में उपयोग कर रहा है?" वन-लाइनर्स आप सभी को देते हैं कि कितने उदाहरण खुले हैं, जो केवल कहानी का हिस्सा है, और ट्रेस सामान केवल नई घड़ियों को खोलने के लिए उपयोगी है।
टीएल; डीआर: यह आपको खुले inotify
उदाहरणों की एक सूची और उनके पास मौजूद घड़ियों की संख्या के साथ-साथ उन पाईदों और बायनेरिज़ के साथ एक फ़ाइल प्राप्त करेगा , जिन्हें वॉच काउंट द्वारा अवरोही क्रम में सॉर्ट किया गया है:
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 एफडी है जिसे हम जांचना चाहते हैं। आइए देखें कि इसमें क्या 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
अहा! अधिक प्रविष्टियाँ! तो हमारे पास छह चीजें होनी चाहिए /tmp
:
joel@opx1:~$ ls /tmp/ | wc -l
6
अति उत्कृष्ट। मेरी नई inotifywait
की सूची में एक प्रविष्टि है fd
(जो कि अन्य वन-लाइनर्स की गिनती यहां है), लेकिन इसकी fdinfo
फाइल में छह प्रविष्टियां हैं । तो हम यह पता लगा सकते हैं कि किसी दिए गए प्रक्रिया के लिए दिए गए एफडी में से कितनी घड़ियों का उपयोग इसकी 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
, पीआईडी और एफडी संख्या को हथियाने, बाद वाले से यू / आर / डब्ल्यू ध्वज को छीनता हूं । फिर प्रत्येक निर्मित fdinfo
पथ के लिए, मैं inotify
लाइनों की संख्या गिनता हूं और गिनती और पिड का उत्पादन करता हूं ।
यह अच्छा होगा यदि मेरे पास ये प्रक्रियाएं एक ही स्थान पर प्रतिनिधित्व करती हैं, हालांकि, सही है? मुझे ऐसा लगा। इसलिए, एक विशेष रूप से गड़बड़ बिट में, मैं पैक करने के लिए पैक करने के लिए 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
बिना सूदो के दौड़ना मेरी प्रक्रियाओं को दिखाने के लिए जो मैंने ऊपर शुरू की, मुझे मिलता है:
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