나는이 문제에 부딪 쳤고,이 답변들 중 어느 것도 " 현재 각 프로세스가 얼마나 많은 시계를 사용하고 있습니까?" 하나의 라이너는 모두 열려있는 인스턴스 수를 제공 하며, 이는 이야기의 일부일 뿐이며, 추적 내용은 새 시계가 열리는 것을 보는 데만 유용합니다.
TL; DR : 열린 inotify
인스턴스 목록과 가지고있는 시계 수와 함께 생성 된 pid 및 바이너리와 함께 시계 수별로 내림차순으로 정렬 된 파일을 가져옵니다.
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
따라서 조사하고자하는 fd는 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
그때 6 가지를 가져야합니다 .
joel@opx1:~$ ls /tmp/ | wc -l
6
우수한. 내 새로운 목록 inotifywait
에는 하나의 항목 fd
(여기서는 다른 하나의 라이너가 계산하는 항목)이 있지만 fdinfo
파일 에는 6 개의 항목이 있습니다. 따라서 주어진 프로세스에 대해 주어진 fd가 해당 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
출력은 PID 및 FD 수를 잡아 후자의 U / R / W 플래그를 제거합니다. 그런 다음 각 구성된 fdinfo
경로 에 대해 inotify
줄 수를 세고 수와 pid를 출력합니다.
이 pid가 같은 장소에서 어떤 프로세스를 나타내는 지 알면 좋을 것입니다. 나는 그렇게 생각했다. 그래서, 특히 지저분한 비트에, 나는 호출에 정착 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
완전한! 프로세스, fd 및 각 시계 가 사용중인 시계 수 의 목록입니다 .
find /proc/*/fd/* -type l -lname 'anon_inode:inotify' -print