আমি এই সমস্যায় পড়েছি, এবং এই উত্তরগুলির কোনও উত্তরই আপনাকে " প্রতিটি প্রক্রিয়া বর্তমানে কত ঘড়ি ব্যবহার করছে?" এর উত্তর দেয় না ওয়ান-লাইনারগুলি আপনাকে জানায় যে কয়টি দৃষ্টান্ত উন্মুক্ত, যা কেবল গল্পের অংশ, এবং ট্রেস স্টাফগুলি কেবল নতুন ঘড়ি খোলার জন্য দরকারী।
টিএল; ডিআর: এটি আপনাকে ওপেন 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একটি পরীক্ষার ফাইলে দৌড়েছি , এবং এফডি এর এটি খোলার দিকে তাকিয়েছি:
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
আহা! আরও এন্ট্রি! সুতরাং আমাদের /tmpতখন ছয়টি জিনিস থাকা উচিত :
joel@opx1:~$ ls /tmp/ | wc -l
6
চমৎকার। আমার নতুন inotifywaitহয়েছে এক তার মধ্যে এন্ট্রি fdতালিকা (যা অন্য এক liners, এখানে বেড়ে চলেছে করা হয়), কিন্তু তার ছয় এন্ট্রি 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
উপরে চালানো আমার প্রক্রিয়াগুলি দেখানোর জন্য sudo ছাড়া এটি চালানো , আমি পেয়েছি:
joel@gladstone:~$ cat watches
6 /proc/4906/fdinfo/3 /usr/bin/inotifywait
1 /proc/22734/fdinfo/4 /usr/bin/tail
পারফেক্ট! প্রক্রিয়াগুলির একটি তালিকা, এফডি এবং প্রতিটি কতগুলি ঘড়ি ব্যবহার করছে, যা আমার প্রয়োজন ঠিক তাই।
find /proc/*/fd/* -type l -lname 'anon_inode:inotify' -print