Ben bu sorunu koştu ve bu cevapların hiçbiri size cevap vermek "kaç saatler her işlem şu anda kullanıyor?" Tek gömlekler, size hikayenin yalnızca bir parçası olan kaç örnek açık olduğunu gösterir ve iz öğeleri yalnızca yeni saatlerin açıldığını görmek için kullanışlıdır.
TL; DR: Bu, size açık inotify
örnekler listesi ve sahip oldukları saat sayısının yanı sıra, onları üreten pids ve binaries ile birlikte, saat sırasına göre azalan düzende sıralanan bir dosya getirecektir :
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
Bu büyük bir karışıklık topu, işte oraya nasıl geldim. Başlamak tail
için bir test dosyasını çalıştırdım ve açtığı fd'ye baktım:
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
Yani, 4 araştırmak istediğimiz fd. Bakalım bunun fdinfo
için ne var :
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
Bu saatin altındaki bir giriş gibi görünüyor!
Daha fazla saat içeren bir şey deneyelim, bu sefer inotifywait
yardımcı programla birlikte , içinde ne olduğunu izleyerek /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! Daha fazla giriş! O zaman altı şeyimiz olmalı /tmp
:
joel@opx1:~$ ls /tmp/ | wc -l
6
Mükemmel. Benim yeni inotifywait
sahiptir biri onun girişi fd
(burada diğer bir astarları sayma budur) listesinde, ama onun altı girdileri fdinfo
dosyası. Böylece, belirli bir işlem için verilen bir fd'nin fdinfo
dosyasına bakarak kaç saat kullandığını anlayabiliriz . Şimdi, saatlerin açık olduğunu bildiren ve her birinin girişlerini saymak için kullanan işlemlerin bir listesini almak için yukarıdakilerden bazılarını bir araya getirmek için fdinfo
. Bu yukarıdakine benzer, bu yüzden sadece bir astarı buraya atacağım:
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
Burada bazı kalın şeyler var, ancak temel hususlar çıktıdan awk
bir fdinfo
yol oluşturmak lsof
, pid ve fd numaralarını almak, u / r / w bayrağını sıyırmak için kullanmam. Daha sonra her inşa edilmiş fdinfo
yol için inotify
satır sayısını sayıyorum ve sayımı ve pid'i çıktıyorum.
Bu çukurların aynı yerde temsil ettiği süreçleri olsa da iyi olurdu, değil mi? Ben de öyle düşünmüştüm. Yani, özellikle dağınık biraz, ben çağırmadan yerleşmiş dirname
iki kez fdinfo
için paketi almak için yolun /proc/<pid>
ekleyerek /exe
kendisine ve sonra çalışan readlink
üzerinde bu sürecin exe adını alır. Şuraya atın, saat sayısına göre sıralayın ve güvenliğini sağlamak için bir dosyaya yönlendirin ve şunu elde ederiz:
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
Sadece yukarıda başlattığım işlemleri göstermek için sudo olmadan çalıştırıyorum :
joel@gladstone:~$ cat watches
6 /proc/4906/fdinfo/3 /usr/bin/inotifywait
1 /proc/22734/fdinfo/4 /usr/bin/tail
Mükemmel! Bir süreç listesi, fd'ler ve her birinin kaç saat kullandığı, bu tam olarak ihtiyacım olan şeydi.
find /proc/*/fd/* -type l -lname 'anon_inode:inotify' -print