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 inotify
instance 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 tail
file 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 inotifywait
utilitas, 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 /tmp
dalamnya:
joel@opx1:~$ ls /tmp/ | wc -l
6
Luar biasa. Baru saya inotifywait
memiliki satu entri dalam fd
daftar (yang menghitung satu-liners lain di sini), tetapi enam entri dalam fdinfo
file -nya . Jadi kita bisa mencari tahu berapa banyak jam tangan yang diberikan fd untuk proses tertentu menggunakan dengan berkonsultasi fdinfo
file -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 awk
untuk membangun fdinfo
jalur dari lsof
output, meraih nomor pid dan fd, melepas bendera u / r / w dari yang terakhir. Kemudian untuk setiap fdinfo
jalur yang dibangun , saya menghitung jumlah inotify
garis 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 dirname
dua kali pada fdinfo
jalan untuk mendapatkan paket ke /proc/<pid>
, menambahkan /exe
untuk itu, dan kemudian berjalan readlink
pada 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