나는작은 스크립트각 프로세스에 대한 inotify 모니터 수를 나열합니다. 보통 이렇게 하면 내가 원하는 것을 얻을 수 있지만 지금은 궁금합니다.어느파일이 모니터링되고 있습니다. 나는 이것이 가능하다고 생각하며이노티파이 시계inotify 인스턴스가 감시하는 파일에 해당합니까?
나도생각하다현재 해당 스크립트에 있는 내용을 기반으로 빌드할 수 있습니다. 예를 들어,
sudo find /proc/*/fd -lname anon_inode:inotify | cut -d "/" -f 3
inotify
파일 설명자를 사용하여 프로세스 목록을 가져옵니다. 파일 설명자 중 하나에 대한 정보를 보면 파일 핸들/관심 목록이라고 가정하는 내용을 얻게 됩니다.
$ sudo cat /proc/50679/fdinfo/19
pos: 0
flags: 00
mnt_id: 15
inotify wd:8 ino:640001 sdev:800001 mask:3cc ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:01006400feaad211
inotify wd:7 ino:a08da sdev:800001 mask:3cc ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:da080a0094019e8f
inotify wd:6 ino:840003 sdev:800001 mask:3cc ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:030084005ae9e3df
inotify wd:5 ino:840002 sdev:800001 mask:3cc ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:020084000d506c1f
inotify wd:4 ino:840001 sdev:800001 mask:3cc ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:01008400e47bab26
inotify wd:3 ino:32004e sdev:800001 mask:3cc ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:4e003200488122df
inotify wd:2 ino:320001 sdev:800001 mask:3cc ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:01003200545a9f32
inotify wd:1 ino:2 sdev:800001 mask:3cc ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:0200000000000000
f_handle:01003200545a9f32
해당 파일을 찾고 기본적으로 f_handle
/proc/../fdinfo/의 a를 파일 이름으로 변환 할 수 있었으면 좋겠습니다 .
답변1
나는 이 영역을 처리하기 위한 표준 도구를 모릅니다 f_handle
. 이는 시스템 호출에 편리 open_by_handle_at(2)
하지만 필드가 항상 유효한 것은 아닙니다. 예를 들어 커널은 nfsd
이를 제공하지 않습니다.
그러나 Linux에서 모든 파일의 전체 좌표는 여전히 sdev
및 ino
필드에 보고되는 이전 장치 번호와 inode 번호입니다. 그것은 단지 그것들을 해독하는 문제일 뿐입니다.
두 값 모두 (현재) 16진수 표기법으로 표현됩니다. ino
그대로 두고 십진수 표현으로 변환하면 됩니다 .
sdev
반면에 값을 전통적인 "주요 및 부" 장치 번호로 분할해야 하므로 일부 디코딩이 필요합니다. 실제 블록 장치에서 지원하지 않는 파일 시스템에 있는 파일에도 sdev
이 필드에 보고되는 고유한 의사 장치 번호가 있습니다.
sdev
필드가 숫자를 표현하기 위해 (8 대신) 20비트를 사용하는 Linux가 "거대한 인코딩"이라고 부르는 방식에 따라 인코딩된다고 가정하면 비트 단위로 주요 숫자는 이고 sdev >> 20
숫자는 입니다 sdev & 0xfffff
. 또는 일반 텍스트 조작 방법을 사용하면 마이너 번호는 가장 오른쪽(최대) 5자리 16진수이고, 메이저 번호는 마지막 5자리 16진수 이전의 모든 숫자입니다. 16진수 숫자가 5개 미만인 경우 주요 번호는 입니다 0
.
전공과 부전공을 취득한 후에는대상 프로세스문서 mountinfo
. 귀하의 경우는 입니다 . 특히 다음 과 같은 쌍이 있는 라인을 /proc/50679/mountinfo
찾습니다.major:minor
제삼대지. 줄을 찾았다다섯find
필드는 원하는 파일/디렉토리를 찾는 데 필요한 최종 경로입니다.
노트:inotify
in 행에서 가져온 메이저와 마이너는 /proc/*/fdinfo/*
16진수로 표시되지만, in은 mountinfo
10진수로 표시되므로 에서 검색하기 전에 변환이 필요합니다 mountinfo
.
노트:의 다섯 번째 필드에는 필드 자체 또는 <space>, <newline>, <tab> 문자가 경로의 일부인 경우 이스케이프된 8진수 시퀀스가 mountinfo
포함될 수 있습니다 . 이는 공백이 , a 등 으로 인코딩됨을 의미합니다. 예를 들어 자신의 지정자 에 대한 경로를 제공하여 이스케이프를 해제할 수 있습니다 .\
\
\040
\
\134
printf(1)
%b
노트:네임스페이스(예: 컨테이너)를 설명하려면 find
마운트 네임스페이스에서 최종 명령을 실행 해야 합니다.대상 프로세스예를 들어 (귀하의 예에서) 다음과 같습니다.
nsenter -mt 50679 find "$unescaped_path" -inum "$decimal_ino" -print -quit