Saya mengalami masalah ini, dan tidak ada jawaban yang memberi Anda jawaban "berapa banyak jam tangan yang digunakan setiap proses saat ini?" The one-liners semua memberi Anda berapa banyak contoh terbuka, yang hanya bagian dari cerita, dan hal-hal jejak hanya berguna untuk melihat jam tangan baru dibuka.
TL; DR: Ini akan memberi Anda file dengan daftar inotifyinstance terbuka dan jumlah jam tangan yang dimilikinya, bersama dengan id dan binari yang memunculkannya, diurutkan dalam urutan menurun berdasarkan jumlah jam:
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
Itu adalah kekacauan besar, jadi inilah cara saya sampai di sana. Untuk memulai, saya menjalankan tailfile tes, dan melihat fd dibuka:
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
Jadi, 4 adalah fd yang ingin kita selidiki. Mari kita lihat apa untungnya 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
Itu terlihat seperti entri untuk arloji di bagian bawah!
Mari kita coba sesuatu dengan lebih banyak jam tangan, kali ini dengan inotifywaitutilitas, hanya menonton apa pun yang ada di /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! Lebih banyak entri! Jadi kita harus memiliki enam hal di /tmpdalamnya:
joel@opx1:~$ ls /tmp/ | wc -l
6
Luar biasa. Baru saya inotifywaitmemiliki satu entri dalam fddaftar (yang menghitung satu-liners lain di sini), tetapi enam entri dalam fdinfofile -nya . Jadi kita bisa mencari tahu berapa banyak jam tangan yang diberikan fd untuk proses tertentu menggunakan dengan berkonsultasi fdinfofile -nya . Sekarang untuk menggabungkannya dengan beberapa hal di atas untuk mengambil daftar proses yang memberitahukan jam tangan terbuka dan menggunakannya untuk menghitung entri di masing-masing fdinfo. Ini mirip dengan di atas, jadi saya hanya akan membuang satu-liner di sini:
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
Ada beberapa hal yang tebal di sini, tetapi dasar-dasarnya adalah yang saya gunakan awkuntuk membangun fdinfojalur dari lsofoutput, meraih nomor pid dan fd, melepas bendera u / r / w dari yang terakhir. Kemudian untuk setiap fdinfojalur yang dibangun , saya menghitung jumlah inotifygaris dan menampilkan jumlah dan pid.
Akan lebih baik jika saya memiliki proses apa yang disajikan oleh pid ini di tempat yang sama, kan? Saya pikir juga begitu. Jadi, dalam sedikit sangat berantakan, aku menetap di menelepon dirnamedua kali pada fdinfojalan untuk mendapatkan paket ke /proc/<pid>, menambahkan /exeuntuk itu, dan kemudian berjalan readlinkpada yang untuk mendapatkan nama exe proses. Lempar ke sana juga, urutkan berdasarkan jumlah jam tangan, dan arahkan ke file untuk disimpan dengan aman dan kami mendapatkan:
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
Menjalankan itu tanpa sudo untuk hanya menunjukkan proses yang saya luncurkan di atas, saya mendapatkan:
joel@gladstone:~$ cat watches
6 /proc/4906/fdinfo/3 /usr/bin/inotifywait
1 /proc/22734/fdinfo/4 /usr/bin/tail
Sempurna! Daftar proses, fd, dan berapa banyak jam tangan masing-masing menggunakan, yang persis apa yang saya butuhkan.
find /proc/*/fd/* -type l -lname 'anon_inode:inotify' -print